diff --git a/.dockerignore b/.dockerignore index 07eab07660..d280741c60 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,7 @@ **/.git +.git +!.git/HEAD +!.git/refs/heads **/*_test.go build/_workspace 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 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` diff --git a/.gitignore b/.gitignore index 7965a251e3..62fc65d03d 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,11 @@ build/_vendor/pkg # travis profile.tmp profile.cov + +# IdeaIDE +.idea + +# dashboard +/dashboard/assets/node_modules +/dashboard/assets/stats.json +/dashboard/assets/public/bundle.js diff --git a/.travis.yml b/.travis.yml index 9bcfb4b76f..6d7cdc61ba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,6 @@ matrix: - go run build/ci.go install - go run build/ci.go test -coverage $TEST_PACKAGES - # These are the latest Go versions. - os: linux dist: trusty sudo: required @@ -26,8 +25,20 @@ matrix: - go run build/ci.go install - go run build/ci.go test -coverage $TEST_PACKAGES + # These are the latest Go versions. + - os: linux + dist: trusty + sudo: required + go: 1.12.x + script: + - 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 $TEST_PACKAGES + - os: osx - go: 1.11.x + go: 1.12.x script: - echo "Increase the maximum number of open file descriptors on macOS" - NOFILE=20480 @@ -44,23 +55,23 @@ matrix: # This builder only tests code linters on latest version of Go - os: linux dist: trusty - go: 1.11.x + go: 1.12.x env: - lint git: - submodules: false # avoid cloning ethereum/tests + submodules: false # avoid cloning ubiq/tests script: - go run build/ci.go lint # This builder does the Ubuntu PPA upload - - if: type = push + - if: repo = ubiq/go-ubiq AND type = push os: linux dist: trusty - go: 1.11.x + go: 1.12.x env: - ubuntu-ppa git: - submodules: false # avoid cloning ethereum/tests + submodules: false # avoid cloning ubiq/tests addons: apt: packages: @@ -68,24 +79,26 @@ matrix: - debhelper - dput - fakeroot + - python-bzrlib + - python-paramiko script: - - go run build/ci.go debsrc -signer "Go Ubiq Linux Builder " -upload ppa:ethereum/ethereum + - echo '|1|7SiYPr9xl3uctzovOTj4gMwAC1M=|t6ReES75Bo/PxlOPJ6/GsGbTrM0= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0aKz5UTUndYgIGG7dQBV+HaeuEZJ2xPHo2DS2iSKvUL4xNMSAY4UguNW+pX56nAQmZKIZZ8MaEvSj6zMEDiq6HFfn5JcTlM80UwlnyKe8B8p7Nk06PPQLrnmQt5fh0HmEcZx+JU9TZsfCHPnX7MNz4ELfZE6cFsclClrKim3BHUIGq//t93DllB+h4O9LHjEUsQ1Sr63irDLSutkLJD6RXchjROXkNirlcNVHH/jwLWR5RcYilNX7S5bIkK8NlWPjsn/8Ua5O7I9/YoE97PpO6i73DTGLh5H9JN/SITwCKBkgSDWUt61uPK3Y11Gty7o2lWsBjhBUm2Y38CBsoGmBw==' >> ~/.ssh/known_hosts + - go run build/ci.go debsrc -upload ubiq/ubiq -sftp-user gubiq-ci -signer "Go Ethereum Linux Builder " # This builder does the Linux Azure uploads - - if: type = push + - if: repo = ubiq/go-ubiq AND type = push os: linux dist: trusty sudo: required - go: 1.11.x + go: 1.12.x env: - azure-linux git: - submodules: false # avoid cloning ethereum/tests + submodules: false # avoid cloning ubiq/tests addons: apt: packages: - gcc-multilib - - fakeroot script: # Build for the primary platforms that Trusty can manage - go run build/ci.go install @@ -107,16 +120,16 @@ matrix: - go run build/ci.go archive -arch arm64 -type tar -signer LINUX_SIGNING_KEY -upload gubiqstore/builds # This builder does the Linux Azure MIPS xgo uploads - - if: type = push + - if: repo = ubiq/go-ubiq AND type = push os: linux dist: trusty services: - docker - go: 1.11.x + go: 1.12.x env: - azure-linux-mips git: - submodules: false # avoid cloning ethereum/tests + submodules: false # avoid cloning ubiq/tests script: - go run build/ci.go xgo --alltools -- --targets=linux/mips --ldflags '-extldflags "-static"' -v - for bin in build/bin/*-linux-mips; do mv -f "${bin}" "${bin/-linux-mips/}"; done @@ -135,7 +148,7 @@ matrix: - go run build/ci.go archive -arch mips64le -type tar -signer LINUX_SIGNING_KEY -upload gubiqstore/builds # This builder does the Android Maven and Azure uploads - - if: type = push + - if: repo = ubiq/go-ubiq AND type = push os: linux dist: trusty addons: @@ -155,33 +168,32 @@ matrix: - azure-android - maven-android git: - submodules: false # avoid cloning ethereum/tests + submodules: false # avoid cloning ubiq/tests before_install: - - curl https://storage.googleapis.com/golang/go1.11.2.linux-amd64.tar.gz | tar -xz + - curl https://dl.google.com/go/go1.12.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-r17b-linux-x86_64.zip -o android-ndk-r17b.zip - - unzip -q android-ndk-r17b.zip && rm android-ndk-r17b.zip - - mv android-ndk-r17b $HOME - - export ANDROID_NDK=$HOME/android-ndk-r17b + - curl https://dl.google.com/android/repository/android-ndk-r19b-linux-x86_64.zip -o android-ndk-r19b.zip + - unzip -q android-ndk-r19b.zip && rm android-ndk-r19b.zip + - mv android-ndk-r19b $ANDROID_HOME/ndk-bundle - - mkdir -p $GOPATH/src/github.com/ethereum - - ln -s `pwd` $GOPATH/src/github.com/ethereum + - mkdir -p $GOPATH/src/github.com/ubiq + - ln -s `pwd` $GOPATH/src/github.com/ubiq/go-ubiq - go run build/ci.go aar -signer ANDROID_SIGNING_KEY -deploy https://oss.sonatype.org -upload gubiqstore/builds # This builder does the OSX Azure, iOS CocoaPods and iOS Azure uploads - - if: type = push + - if: repo = ubiq/go-ubiq AND type = push os: osx - go: 1.11.x + go: 1.12.x env: - azure-osx - azure-ios - cocoapods-ios git: - submodules: false # avoid cloning ethereum/tests + submodules: false # avoid cloning ubiq/tests script: - go run build/ci.go install - go run build/ci.go archive -type tar -signer OSX_SIGNING_KEY -upload gubiqstore/builds @@ -202,13 +214,22 @@ matrix: - go run build/ci.go xcode -signer IOS_SIGNING_KEY -deploy trunk -upload gubiqstore/builds # This builder does the Azure archive purges to avoid accumulating junk - - if: type = cron + - if: repo = ubiq/go-ubiq AND type = cron os: linux dist: trusty - go: 1.11.x + go: 1.12.x env: - azure-purge git: - submodules: false # avoid cloning ethereum/tests + submodules: false # avoid cloning ubiq/tests script: - go run build/ci.go purge -store gubiqstore/builds -days 14 + + - name: Race Detector for Swarm + if: repo = ethersphere/go-ubiq + os: linux + dist: trusty + go: 1.12.x + git: + submodules: false # avoid cloning ubiq/tests + script: ./build/travis_keepalive.sh go test -v -timeout 20m -race ./swarm... diff --git a/Dockerfile b/Dockerfile index aef9f8fe16..bba36819e2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,16 @@ -# Use Alpine Linux -FROM golang:1.9-alpine as builder +# Build Gubiq 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-ubiq -RUN \ - apk add --update git go make gcc musl-dev linux-headers && \ - (cd go-ubiq && make gubiq) && \ - cp go-ubiq/build/bin/gubiq /usr/local/bin/ && \ - apk del git go make gcc musl-dev linux-headers && \ - rm -rf /go-ubiq && rm -rf /var/cache/apk/* +RUN cd /go-ubiq && make gubiq -EXPOSE 8588 -EXPOSE 30388 -EXPOSE 30388/udp +# Pull Gubiq into a second stage deploy alpine container +FROM alpine:latest +RUN apk add --no-cache ca-certificates +COPY --from=builder /go-ubiq/build/bin/gubiq /usr/local/bin/ + +EXPOSE 8588 8589 30388 30388/udp 30389/udp ENTRYPOINT ["gubiq"] diff --git a/Dockerfile.alltools b/Dockerfile.alltools new file mode 100644 index 0000000000..7e7f86eae6 --- /dev/null +++ b/Dockerfile.alltools @@ -0,0 +1,15 @@ +# Build Gubiq 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-ubiq +RUN cd /go-ubiq && 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-ubiq/build/bin/* /usr/local/bin/ + +EXPOSE 8588 8589 30388 30388/udp 30389/udp diff --git a/Makefile b/Makefile index 0c24e64c6c..5a6224146c 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ .PHONY: gubiq-darwin gubiq-darwin-386 gubiq-darwin-amd64 .PHONY: gubiq-windows gubiq-windows-386 gubiq-windows-amd64 -GOBIN = build/bin +GOBIN = $(shell pwd)/build/bin GO ?= latest gubiq: @@ -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 04d4e318b6..e77d16563a 100644 --- a/README.md +++ b/README.md @@ -30,10 +30,9 @@ The go-ubiq project comes with several wrappers/executables found in the `cmd` d | Command | Description | |:----------:|-------------| | **`gubiq`** | Our main Ubiq CLI client. It is the entry point into the Ubiq 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 Ubiq network via JSON RPC endpoints exposed on top of HTTP, WebSocket and/or IPC transports. `gubiq --help` and the [CLI Wiki page](https://github.com/ubiq/go-ubiq/wiki/Command-Line-Options) for command line options. | -| `abigen` | Source code generator to convert Ubiq contract definitions into easy to use, compile-time type-safe Go packages. It operates on plain [Ubiq 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/ubiq/go-ubiq/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) wiki page for details. | +| `abigen` | Source code generator to convert Ubiq contract definitions into easy to use, compile-time type-safe Go packages. It operates on plain [Ethereum contract ABIs](https://github.com/ubiq/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/ubiq/go-ubiq/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) wiki page for details. | | `bootnode` | Stripped down version of our Ubiq 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`). | +| `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`). | | `gubiqrpctest` | Developer utility tool to support our [ubiq/rpc-test](https://github.com/ubiq/rpc-tests) test suite which validates baseline conformity to the [Ethereum JSON RPC](https://github.com/ubiq/wiki/wiki/JSON-RPC) specs. Please see the [test suite's readme](https://github.com/ubiq/rpc-tests/blob/master/README.md) for details. | | `rlpdump` | Developer utility tool to convert binary RLP ([Recursive Length Prefix](https://github.com/ubiq/wiki/wiki/RLP)) dumps (data encoding used by the Ubiq protocol both network as well as consensus wise) to user friendlier hierarchical representation (e.g. `rlpdump --hex CE0183FFFFFFC4C304050583616263`). | @@ -63,7 +62,7 @@ This command will: sync times especially for HDD users. This flag is optional and you can set it as high or as low as you'd like, though we'd recommend the 512MB - 2GB range. * Start up Gubiq's built-in interactive [JavaScript console](https://github.com/ubiq/go-ubiq/wiki/JavaScript-Console), - (via the trailing `console` subcommand) through which you can invoke all official [`web3` methods](https://github.com/ethereum/wiki/wiki/JavaScript-API) + (via the trailing `console` subcommand) through which you can invoke all official [`web3` methods](https://github.com/ubiq/wiki/wiki/JavaScript-API) as well as Gubiq's own [management APIs](https://github.com/ubiq/go-ubiq/wiki/Management-APIs). This too is optional and if you leave it out you can always attach to an already running Gubiq instance with `gubiq attach`. @@ -112,7 +111,7 @@ To get an idea how the file should look like you can use the `dumpconfig` subcom $ gubiq --your-favourite-flags dumpconfig ``` -*Note: This works only with gubiq v1.6.0 and above* +*Note: This works only with gubiq v1.6.0 and above.* #### Docker quick start @@ -126,11 +125,13 @@ docker run -d --name ubiq-node -v /Users/alice/ubiq:/root \ This will start gubiq 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. +Do not forget `--rpcaddr 0.0.0.0`, if you want to access RPC from other containers and/or hosts. By default, `gubiq` binds to the local interface and RPC endpoints is not accessible from the outside. + ### Programatically interfacing Gubiq nodes As a developer, sooner rather than later you'll want to start interacting with Gubiq and the Ubiq network via your own programs and not manually through the console. To aid this, Gubiq has built in -support for a JSON-RPC based APIs ([standard APIs](https://github.com/ethereum/wiki/wiki/JSON-RPC) and +support for a JSON-RPC based APIs ([standard APIs](https://github.com/ubiq/wiki/wiki/JSON-RPC) and [Gubiq specific APIs](https://github.com/ubiq/go-ubiq/wiki/Management-APIs)). These can be exposed via HTTP, WebSockets and IPC (unix sockets on unix based platforms, and named pipes on Windows). @@ -223,7 +224,7 @@ $ bootnode --genkey=boot.key $ bootnode --nodekey=boot.key ``` -With the bootnode online, it will display an [`enode` URL](https://github.com/ethereum/wiki/wiki/enode-url-format) +With the bootnode online, it will display an [`enode` URL](https://github.com/ubiq/wiki/wiki/enode-url-format) that other nodes can use to connect to it and exchange peer information. Make sure to replace the displayed IP address information (most probably `[::]`) with your externally accessible IP to get the actual `enode` URL. @@ -244,6 +245,26 @@ $ gubiq --datadir=path/to/custom/data/folder --bootnodes= --mine --minerthreads=1 --etherbase=0x0000000000000000000000000000000000000000 +``` + +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`). + ## Contribution Thank you for considering to help out with the source code! We welcome contributions from diff --git a/VERSION b/VERSION index 7ec1d6db40..ccbccc3dc6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.1.0 +2.2.0 diff --git a/accounts/abi/abi.go b/accounts/abi/abi.go index 2113bc1380..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/ubiq/go-ubiq/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 5c78b0e896..93747cad4e 100644 --- a/accounts/abi/abi_test.go +++ b/accounts/abi/abi_test.go @@ -29,25 +29,6 @@ import ( "github.com/ubiq/go-ubiq/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/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index b57e6a7c7b..f049750c94 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/ubiq/go-ubiq" "github.com/ubiq/go-ubiq/accounts/abi/bind" @@ -33,7 +34,6 @@ import ( "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/core/vm" "github.com/ubiq/go-ubiq/ethdb" - "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/params" ) @@ -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. @@ -59,9 +60,9 @@ 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.AllUbqhashProtocolChanges, Alloc: alloc} genesis.MustCommit(database) - blockchain, _ := core.NewBlockChain(database, genesis.Config, ubqhash.NewFaker(), new(event.TypeMux), vm.Config{}) + blockchain, _ := core.NewBlockChain(database, genesis.Config, ubqhash.NewFaker(), vm.Config{}) backend := &SimulatedBackend{database: database, blockchain: blockchain, config: genesis.Config} backend.rollback() return backend @@ -168,7 +169,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 +179,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 } @@ -203,36 +204,53 @@ 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 - var lo, hi uint64 - if call.Gas != nil { + // Determine the lowest and highest possible gas limits to binary search in between + var ( + 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() - _, 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 { - lo = mid - continue + if err != nil || failed { + 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 } // 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,8 +272,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() - 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. @@ -284,6 +302,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 diff --git a/accounts/abi/bind/bind.go b/accounts/abi/bind/bind.go index b8030826c7..5a749c532f 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 gofmt to clean it up if lang == LangGo { - code, err := format.Source(buffer.Bytes()) + 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 a24efb9f77..f454c671e4 100644 --- a/accounts/abi/bind/bind_test.go +++ b/accounts/abi/bind/bind_test.go @@ -582,7 +582,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) } diff --git a/accounts/abi/bind/template.go b/accounts/abi/bind/template.go index dcf7500cd7..182242f4e2 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}} 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 6613fd43d6..90fcb86c3d 100644 --- a/accounts/abi/event.go +++ b/accounts/abi/event.go @@ -18,6 +18,7 @@ package abi import ( "fmt" + "reflect" "strings" "github.com/ubiq/go-ubiq/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 b87127a466..107263faae 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 5e60ea3163..9f15e690fb 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 fe1fb94c66..02539e65e7 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 9461587e04..743b5238c4 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 d16c4aefef..5c4e058872 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 0b7c147fe8..5189b76c83 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/ubiq/go-ubiq/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 5323bdf5b7..505055f04a 100644 --- a/accounts/abi/unpack.go +++ b/accounts/abi/unpack.go @@ -25,122 +25,20 @@ import ( "github.com/ubiq/go-ubiq/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: - 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: @@ -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 5361b27c54..8c071022ce 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/ubiq/go-ubiq/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")) diff --git a/accounts/accounts.go b/accounts/accounts.go index 9d7216fd06..e0862d8c85 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 @@ -147,9 +148,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 07f248ced7..208f586711 100644 --- a/accounts/hd.go +++ b/accounts/hd.go @@ -27,13 +27,18 @@ import ( // DefaultRootDerivationPath is the root path to which custom derivation endpoints // are appended. As such, the first account will be at m/44'/108'/0'/0, the second // at m/44'/108'/0'/1, etc. -var DefaultRootDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0} +var DefaultRootDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 108, 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'/108'/0'/0, the second // at m/44'/108'/0'/1, etc. var DefaultBaseDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 108, 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'/108'/0'/0, the second +// at m/44'/108'/0'/1, etc. +var DefaultLedgerBaseDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0} + // DerivationPath represents the computer friendly version of a hierarchical // deterministic wallet account derivation path. // diff --git a/accounts/hd_test.go b/accounts/hd_test.go index 11377cccef..05a8efc7f4 100644 --- a/accounts/hd_test.go +++ b/accounts/hd_test.go @@ -37,11 +37,11 @@ func TestHDPathParsing(t *testing.T) { {"m/2147483692/2147483756/2147483648/2147483648", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0x80000000 + 0}}, // Plain relative derivation paths - {"0", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0}}, - {"128", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 128}}, - {"0'", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0x80000000 + 0}}, - {"128'", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0x80000000 + 128}}, - {"2147483648", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0x80000000 + 0}}, + {"0", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0, 0}}, + {"128", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0, 128}}, + {"0'", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0, 0x80000000 + 0}}, + {"128'", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0, 0x80000000 + 128}}, + {"2147483648", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0, 0x80000000 + 0}}, // Hexadecimal absolute derivation paths {"m/0x2C'/0x3c'/0x00'/0x00", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0}}, @@ -52,11 +52,11 @@ func TestHDPathParsing(t *testing.T) { {"m/0x8000002C/0x8000006c/0x80000000/0x80000000", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0x80000000 + 0}}, // Hexadecimal relative derivation paths - {"0x00", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0}}, - {"0x80", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 128}}, - {"0x00'", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0x80000000 + 0}}, - {"0x80'", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0x80000000 + 128}}, - {"0x80000000", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0x80000000 + 0}}, + {"0x00", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0, 0}}, + {"0x80", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0, 128}}, + {"0x00'", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0, 0x80000000 + 0}}, + {"0x80'", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0, 0x80000000 + 128}}, + {"0x80000000", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0, 0x80000000 + 0}}, // Weird inputs just to ensure they work {" m / 44 '\n/\n 108 \n\n\t' /\n0 ' /\t\t 0", DerivationPath{0x80000000 + 44, 0x80000000 + 108, 0x80000000 + 0, 0}}, diff --git a/accounts/keystore/account_cache.go b/accounts/keystore/account_cache.go index 6fb2f1ff6f..4ed703eafb 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" @@ -31,6 +30,7 @@ import ( "github.com/ubiq/go-ubiq/accounts" "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/log" + "gopkg.in/fatih/set.v0" ) // Minimum amount of time between cache reloads. This limit applies if the platform does @@ -71,6 +71,7 @@ type accountCache struct { byAddr map[common.Address][]accounts.Account throttle *time.Timer notify chan struct{} + fileC fileCache } func newAccountCache(keydir string) (*accountCache, chan struct{}) { @@ -78,6 +79,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 +129,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 +186,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 +204,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,80 +228,71 @@ 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() +// scanAccounts checks if any changes have occurred on the filesystem, and +// updates the account cache accordingly +func (ac *accountCache) scanAccounts() error { + // 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 } - ac.all = accounts - sort.Sort(ac.all) - for k := range ac.byAddr { - delete(ac.byAddr, k) + if creates.Size() == 0 && deletes.Size() == 0 && updates.Size() == 0 { + return nil } - for _, a := range accounts { - ac.byAddr[a.Address] = append(ac.byAddr[a.Address], a) + // Create a helper method to scan the contents of the key files + var ( + buf = new(bufio.Reader) + key struct { + Address string `json:"address"` + } + ) + readAccount := func(path string) *accounts.Account { + fd, err := os.Open(path) + if err != nil { + log.Trace("Failed to open keystore file", "path", path, "err", err) + return nil + } + defer fd.Close() + buf.Reset(fd) + // Parse the 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) + case (addr == common.Address{}): + log.Debug("Failed to decode keystore key", "path", path, "err", "missing or zero address") + default: + return &accounts.Account{Address: addr, URL: accounts.URL{Scheme: KeyStoreScheme, Path: path}} + } + return nil } + // Process all the file diffs + start := time.Now() + + for _, p := range creates.List() { + if a := readAccount(p.(string)); a != nil { + ac.add(*a) + } + } + for _, p := range deletes.List() { + ac.deleteByFile(p.(string)) + } + for _, p := range updates.List() { + path := p.(string) + ac.deleteByFile(path) + if a := readAccount(path); a != nil { + ac.add(*a) + } + } + end := time.Now() + select { case ac.notify <- struct{}{}: default: } - log.Debug("Reloaded keystore contents", "accounts", len(ac.all)) -} - -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"` - } - ) - for _, fi := range files { - path := filepath.Join(ac.keydir, fi.Name()) - if skipKeyFile(fi) { - log.Trace("Ignoring file on account scan", "path", path) - continue - } - logger := log.New("path", path) - - fd, err := os.Open(path) - if err != nil { - logger.Trace("Failed to open keystore file", "err", err) - continue - } - buf.Reset(fd) - // Parse the address. - keyJSON.Address = "" - err = json.NewDecoder(buf).Decode(&keyJSON) - addr := common.HexToAddress(keyJSON.Address) - switch { - case err != nil: - logger.Debug("Failed to decode keystore key", "err", err) - case (addr == common.Address{}): - logger.Debug("Failed to decode keystore key", "err", "missing or zero address") - default: - addrs = append(addrs, accounts.Account{Address: addr, URL: accounts.URL{Scheme: KeyStoreScheme, Path: path}}) - } - fd.Close() - } - return addrs, err -} - -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 + log.Trace("Handled keystore changes", "time", end.Sub(start)) + return nil } diff --git a/accounts/keystore/account_cache_test.go b/accounts/keystore/account_cache_test.go index 387cf9bdfd..8d9617ccd9 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/file_cache.go b/accounts/keystore/file_cache.go new file mode 100644 index 0000000000..73f6e3e1a5 --- /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/ubiq/go-ubiq/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 +} diff --git a/accounts/keystore/key.go b/accounts/keystore/key.go index 64bac38442..a451ed8e4a 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.go b/accounts/keystore/keystore.go index f5c532c2aa..77b2cc2e2c 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_passphrase.go b/accounts/keystore/keystore_passphrase.go index d0714cf309..a33cebcf93 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 { @@ -140,7 +147,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 +282,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/keystore/keystore_test.go b/accounts/keystore/keystore_test.go index 87f0f3f371..d4e5da9237 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.Arrive { - t.Errorf("departure 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.Arrive { - t.Errorf("arrival 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/keystore_wallet.go b/accounts/keystore/keystore_wallet.go index 46efe88ff6..b778912001 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/keystore/watch.go b/accounts/keystore/watch.go index 650fa4c604..3ed082513e 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,32 +81,28 @@ 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 + debounceDuration = 500 * time.Millisecond + rescanTriggered = false + debounce = time.NewTimer(0) ) + // Ignore initial trigger + if !debounce.Stop() { + <-debounce.C + } defer debounce.Stop() for { select { 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 } } } diff --git a/accounts/manager.go b/accounts/manager.go index 740997d23d..2f5171ef23 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), @@ -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/ledger_hub.go b/accounts/usbwallet/hub.go similarity index 59% rename from accounts/usbwallet/ledger_hub.go rename to accounts/usbwallet/hub.go index 046ac3f404..faf64b7e27 100644 --- a/accounts/usbwallet/ledger_hub.go +++ b/accounts/usbwallet/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 ( @@ -33,24 +29,30 @@ 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 + 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 -// 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 @@ -65,20 +67,36 @@ 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 */}, 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 */}, 0xff00, 0, newTrezorDriver) +} + +// newHub creates a new hardware wallet manager for generic USB devices. +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") } - hub := &LedgerHub{ - quit: make(chan chan error), + hub := &Hub{ + scheme: scheme, + vendorID: vendorID, + productIDs: productIDs, + usageID: usageID, + endpointID: endpointID, + 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() @@ -92,17 +110,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, @@ -117,10 +135,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.UsagePage == hub.usageID || info.Interface == hub.endpointID) { + devices = append(devices, info) break } } @@ -132,22 +150,29 @@ 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()) { - events = append(events, accounts.WalletEvent{Wallet: hub.wallets[0], Arrive: false}) + 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, Arrive: true}) + events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletArrived}) wallets = append(wallets, wallet) continue } @@ -160,7 +185,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 @@ -173,8 +198,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() @@ -190,18 +215,14 @@ 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 { - // 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(refreshCycle) + // Run the wallet refresher hub.refreshWallets() 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.go b/accounts/usbwallet/ledger.go new file mode 100644 index 0000000000..8565ebeaa5 --- /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/ubiq/go-ubiq/accounts" + "github.com/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/common/hexutil" + "github.com/ubiq/go-ubiq/core/types" + "github.com/ubiq/go-ubiq/log" + "github.com/ubiq/go-ubiq/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 97c60c48ba..0000000000 --- a/accounts/usbwallet/ledger_wallet.go +++ /dev/null @@ -1,903 +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/ubiq/go-ubiq" - "github.com/ubiq/go-ubiq/accounts" - "github.com/ubiq/go-ubiq/common" - "github.com/ubiq/go-ubiq/common/hexutil" - "github.com/ubiq/go-ubiq/core/types" - "github.com/ubiq/go-ubiq/log" - "github.com/ubiq/go-ubiq/rlp" - "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 - -// 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 "Ubiq app in browser mode" - } - if w.offline() { - return "Ubiq app offline" - } - return fmt.Sprintf("Ubiq 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 - } - 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(ledgerHeartbeatCycle): - // 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(ledgerSelfDeriveThrottling): - // 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..8f75d5e7ba --- /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/ubiq/go-ubiq/accounts" + "github.com/ubiq/go-ubiq/accounts/usbwallet/internal/trezor" + "github.com/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/common/hexutil" + "github.com/ubiq/go-ubiq/core/types" + "github.com/ubiq/go-ubiq/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/wallet.go b/accounts/usbwallet/wallet.go new file mode 100644 index 0000000000..fda6157095 --- /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/ubiq/go-ubiq" + "github.com/ubiq/go-ubiq/accounts" + "github.com/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/core/types" + "github.com/ubiq/go-ubiq/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/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..1b3b4d0f15 --- /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/ubiq/go-ubiq/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/build/ci-notes.md b/build/ci-notes.md index 24c7b4257e..13d9222b78 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-ubiq 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/ci.go b/build/ci.go index b2cb5cbe5a..2a7baa788d 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 @@ -119,7 +120,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", "artful"} ) var GOBIN, _ = filepath.Abs(filepath.Join("build", "bin")) @@ -145,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": @@ -255,10 +259,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. @@ -291,7 +292,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) @@ -305,10 +305,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 @@ -317,35 +314,31 @@ 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] + 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") - 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...)...) + // 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...)...) } } @@ -527,7 +520,7 @@ func isUnstableBuild(env build.Environment) bool { type debMetadata struct { Env build.Environment - // go-ubiq version being built. Note that this + // go-ethereum version being built. Note that this // is not the debian package version. The package version // is constructed by VersionString. Version string diff --git a/build/deb.control b/build/deb.control index 16ef451bb6..7453eba50c 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/ubiq/go-ubiq.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: diff --git a/build/nsis.install.nsh b/build/nsis.install.nsh index 56b37cfe06..791fa104ea 100644 --- a/build/nsis.install.nsh +++ b/build/nsis.install.nsh @@ -5,7 +5,7 @@ OutFile "${OUTPUTFILE}" # set through command line arguments # Links for "Add/Remove Programs" !define HELPURL "https://github.com/ubiq/go-ubiq/issues" !define UPDATEURL "https://github.com/ubiq/go-ubiq/releases" -!define ABOUTURL "https://github.com/ubiq/go-ubiq#ethereum-go" +!define ABOUTURL "https://github.com/ubiq/go-ubiq#ubiq-go" !define /date NOW "%Y%m%d" PageEx license diff --git a/cmd/evm/disasm.go b/cmd/evm/disasm.go index e37edc59a1..4eb06ea51b 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/evm/json_logger.go b/cmd/evm/json_logger.go index 6bf44e1c46..f9a4b422cf 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, @@ -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/main.go b/cmd/evm/main.go index 4fe36d9148..d8920d6d67 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, } @@ -138,6 +143,7 @@ func init() { compileCommand, disasmCommand, runCommand, + stateTestCommand, } } diff --git a/cmd/evm/runner.go b/cmd/evm/runner.go index 2a94d4b5d9..8120fa92f8 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) @@ -227,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/cmd/evm/staterunner.go b/cmd/evm/staterunner.go new file mode 100644 index 0000000000..dcdd68b0f0 --- /dev/null +++ b/cmd/evm/staterunner.go @@ -0,0 +1,125 @@ +// 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/ubiq/go-ubiq/core/state" + "github.com/ubiq/go-ubiq/core/vm" + "github.com/ubiq/go-ubiq/log" + "github.com/ubiq/go-ubiq/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} + 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 { + dump := state.RawDump() + 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 + 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/cmd/faucet/faucet.go b/cmd/faucet/faucet.go index 7bcdf52638..a315249587 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 the request was accepted + Tx *types.Transaction `json:"tx"` // Transaction funding the account } // faucet represents a crypto faucet backed by an Ethereum light client. @@ -299,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() @@ -313,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 { @@ -341,18 +371,25 @@ 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/") { - 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/") { + 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", "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 != "" { @@ -362,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 { @@ -372,73 +412,55 @@ 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 } } - // 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/ubiq/go-ubiq/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 { - if len(file.Content) == 2+common.AddressLength*2 { - address = common.HexToAddress(file.Content) + if err = sendError(conn, err); err != nil { + log.Warn("Failed to send prefix error to client", "err", err) + return } - } - 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)) @@ -447,33 +469,45 @@ 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{ - 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() // 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", gist.Owner.Login, 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: @@ -496,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 @@ -511,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() } @@ -532,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() } @@ -541,3 +595,184 @@ 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) { + // 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..5d3b8741ba 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

- +
" + msg.requests[i].account + "
" + moment.duration(moment(msg.requests[i].time).unix()-moment().unix(), 'seconds').humanize(true) + ""; + for (var i=0; i"; + content += "
"; + content += "
" + requests[i].account + "
"; + content += " "; + 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 += " "; + 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 3151ab5842..6a99f8c6f8 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\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( @@ -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/cmd/gubiq/accountcmd.go b/cmd/gubiq/accountcmd.go index bf6edf2571..874a3e09c0 100644 --- a/cmd/gubiq/accountcmd.go +++ b/cmd/gubiq/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 := gubiqConfig{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/cmd/gubiq/accountcmd_test.go b/cmd/gubiq/accountcmd_test.go index 68736dc03f..08a280be11 100644 --- a/cmd/gubiq/accountcmd_test.go +++ b/cmd/gubiq/accountcmd_test.go @@ -134,7 +134,7 @@ Fatal: could not decrypt key with given passphrase func TestUnlockFlag(t *testing.T) { datadir := tmpDatadirWithKeystore(t) gubiq := runGubiq(t, - "--datadir", datadir, "--nat", "none", "--nodiscover", "--dev", + "--datadir", datadir, "--nat", "none", "--nodiscover", "--maxpeers", "0", "--port", "0", "--unlock", "f466859ead1932d743d622cb74fc058882e8648a", "js", "testdata/empty.js") gubiq.Expect(` @@ -146,7 +146,7 @@ Passphrase: {{.InputLine "foobar"}} wantMessages := []string{ "Unlocked account", - "=0xf466859ead1932d743d622cb74fc058882e8648a", + "=0xf466859eAD1932D743d622CB74FC058882E8648A", } for _, m := range wantMessages { if !strings.Contains(gubiq.StderrText(), m) { @@ -158,7 +158,7 @@ Passphrase: {{.InputLine "foobar"}} func TestUnlockFlagWrongPassword(t *testing.T) { datadir := tmpDatadirWithKeystore(t) gubiq := runGubiq(t, - "--datadir", datadir, "--nat", "none", "--nodiscover", "--dev", + "--datadir", datadir, "--nat", "none", "--nodiscover", "--maxpeers", "0", "--port", "0", "--unlock", "f466859ead1932d743d622cb74fc058882e8648a") defer gubiq.ExpectExit() gubiq.Expect(` @@ -177,7 +177,7 @@ Fatal: Failed to unlock account f466859ead1932d743d622cb74fc058882e8648a (could func TestUnlockFlagMultiIndex(t *testing.T) { datadir := tmpDatadirWithKeystore(t) gubiq := runGubiq(t, - "--datadir", datadir, "--nat", "none", "--nodiscover", "--dev", + "--datadir", datadir, "--nat", "none", "--nodiscover", "--maxpeers", "0", "--port", "0", "--unlock", "0,2", "js", "testdata/empty.js") gubiq.Expect(` @@ -191,8 +191,8 @@ Passphrase: {{.InputLine "foobar"}} wantMessages := []string{ "Unlocked account", - "=0x7ef5a6135f1fd6a02593eedc869c6d41d934aef8", - "=0x289d485d9771714cce91d3393d764e1311907acc", + "=0x7EF5A6135f1FD6a02593eEdC869c6D41D934aef8", + "=0x289d485D9771714CCe91D3393D764E1311907ACc", } for _, m := range wantMessages { if !strings.Contains(gubiq.StderrText(), m) { @@ -204,15 +204,15 @@ Passphrase: {{.InputLine "foobar"}} func TestUnlockFlagPasswordFile(t *testing.T) { datadir := tmpDatadirWithKeystore(t) gubiq := runGubiq(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") gubiq.ExpectExit() wantMessages := []string{ "Unlocked account", - "=0x7ef5a6135f1fd6a02593eedc869c6d41d934aef8", - "=0x289d485d9771714cce91d3393d764e1311907acc", + "=0x7EF5A6135f1FD6a02593eEdC869c6D41D934aef8", + "=0x289d485D9771714CCe91D3393D764E1311907ACc", } for _, m := range wantMessages { if !strings.Contains(gubiq.StderrText(), m) { @@ -224,7 +224,7 @@ func TestUnlockFlagPasswordFile(t *testing.T) { func TestUnlockFlagPasswordFileWrongPassword(t *testing.T) { datadir := tmpDatadirWithKeystore(t) gubiq := runGubiq(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 gubiq.ExpectExit() gubiq.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") gubiq := runGubiq(t, - "--keystore", store, "--nat", "none", "--nodiscover", "--dev", + "--keystore", store, "--nat", "none", "--nodiscover", "--maxpeers", "0", "--port", "0", "--unlock", "f466859ead1932d743d622cb74fc058882e8648a", "js", "testdata/empty.js") defer gubiq.ExpectExit() @@ -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(gubiq.StderrText(), m) { @@ -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") gubiq := runGubiq(t, - "--keystore", store, "--nat", "none", "--nodiscover", "--dev", + "--keystore", store, "--nat", "none", "--nodiscover", "--maxpeers", "0", "--port", "0", "--unlock", "f466859ead1932d743d622cb74fc058882e8648a") defer gubiq.ExpectExit() diff --git a/cmd/gubiq/chaincmd.go b/cmd/gubiq/chaincmd.go index 69d8d23376..bbdc3bc6f1 100644 --- a/cmd/gubiq/chaincmd.go +++ b/cmd/gubiq/chaincmd.go @@ -31,7 +31,9 @@ import ( "github.com/ubiq/go-ubiq/core" "github.com/ubiq/go-ubiq/core/state" "github.com/ubiq/go-ubiq/core/types" + "github.com/ubiq/go-ubiq/eth/downloader" "github.com/ubiq/go-ubiq/ethdb" + "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/log" "github.com/ubiq/go-ubiq/trie" "github.com/syndtr/goleveldb/leveldb/util" @@ -71,7 +73,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 +92,22 @@ 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: "Create a local chain from a target chaindata folder", + ArgsUsage: "", + Flags: []cli.Flag{ + utils.DataDirFlag, + utils.CacheFlag, + utils.SyncModeFlag, + utils.FakePoWFlag, + utils.TestnetFlag, + }, + 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,54 @@ func exportChain(ctx *cli.Context) error { return nil } +func copyDb(ctx *cli.Context) error { + // Ensure we have a source chain directory to copy + if len(ctx.Args()) != 1 { + 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) + + syncmode := *utils.GlobalTextMarshaler(ctx, utils.SyncModeFlag.Name).(*downloader.SyncMode) + dl := downloader.New(syncmode, chainDb, new(event.TypeMux), chain, nil, nil) + + // 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(db, chain.Config(), chain.Engine(), func() bool { return false }) + if err != nil { + return err + } + 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 { + return err + } + for dl.Synchronising() { + time.Sleep(10 * time.Millisecond) + } + fmt.Printf("Database copy done in %v\n", 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 { + 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/gubiq/config.go b/cmd/gubiq/config.go index c7ebcd7521..6e23834ac6 100644 --- a/cmd/gubiq/config.go +++ b/cmd/gubiq/config.go @@ -30,6 +30,7 @@ import ( "github.com/ubiq/go-ubiq/cmd/utils" "github.com/ubiq/go-ubiq/contracts/release" + "github.com/ubiq/go-ubiq/dashboard" "github.com/ubiq/go-ubiq/eth" "github.com/ubiq/go-ubiq/node" "github.com/ubiq/go-ubiq/params" @@ -76,10 +77,11 @@ type ethstatsConfig struct { } type gubiqConfig 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 *gubiqConfig) error { @@ -110,9 +112,10 @@ func defaultNodeConfig() node.Config { func makeConfigNode(ctx *cli.Context) (*node.Node, gubiqConfig) { // Load defaults. cfg := gubiqConfig{ - 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, gubiqConfig) { } utils.SetShhConfig(ctx, stack, &cfg.Shh) + utils.SetDashboardConfig(ctx, &cfg.Dashboard) return stack, cfg } @@ -153,9 +157,12 @@ 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.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/gubiq/main.go b/cmd/gubiq/main.go index d0d8d9331a..11cfe4ef67 100644 --- a/cmd/gubiq/main.go +++ b/cmd/gubiq/main.go @@ -21,6 +21,7 @@ import ( "fmt" "os" "runtime" + "sort" "strings" "time" @@ -60,6 +61,11 @@ var ( utils.DataDirFlag, utils.KeyStoreDirFlag, utils.NoUSBFlag, + utils.DashboardEnabledFlag, + utils.DashboardAddrFlag, + utils.DashboardPortFlag, + utils.DashboardRefreshFlag, + utils.DashboardAssetsFlag, utils.UbqhashCacheDirFlag, utils.UbqhashCachesInMemoryFlag, utils.UbqhashCachesOnDiskFlag, @@ -67,6 +73,8 @@ var ( utils.UbqhashDatasetsInMemoryFlag, utils.UbqhashDatasetsOnDiskFlag, utils.TxPoolNoLocalsFlag, + utils.TxPoolJournalFlag, + utils.TxPoolRejournalFlag, utils.TxPoolPriceLimitFlag, utils.TxPoolPriceBumpFlag, utils.TxPoolAccountSlotsFlag, @@ -96,7 +104,8 @@ var ( utils.NetrestrictFlag, utils.NodeKeyFileFlag, utils.NodeKeyHexFlag, - utils.DevModeFlag, + utils.DeveloperFlag, + utils.DeveloperPeriodFlag, utils.TestnetFlag, utils.VMEnableDebugFlag, utils.NetworkIdFlag, @@ -142,6 +151,7 @@ func init() { initCommand, importCommand, exportCommand, + copydbCommand, removedbCommand, dumpCommand, // See monitorcmd.go: @@ -154,6 +164,7 @@ func init() { attachCommand, javascriptCommand, // See misccmd.go: + makecacheCommand, makedagCommand, versionCommand, bugCommand, @@ -161,6 +172,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...) @@ -233,31 +245,37 @@ 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: + 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 { - 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() } } }() // 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/gubiq/misccmd.go b/cmd/gubiq/misccmd.go index 4bd03e6386..e5111227b2 100644 --- a/cmd/gubiq/misccmd.go +++ b/cmd/gubiq/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 ubqhash DAG (for testing)", + makecacheCommand = cli.Command{ + Action: utils.MigrateFlags(makecache), + Name: "makecache", + Usage: "Generate ubqhash verification cache (for testing)", ArgsUsage: " ", Category: "MISCELLANEOUS COMMANDS", Description: ` -The makedag command generates an ubqhash DAG in /tmp/dag. +The makecache command generates an ubqhash 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 ubqhash mining DAG (for testing)", + ArgsUsage: " ", + Category: "MISCELLANEOUS COMMANDS", + Description: ` +The makedag command generates an ubqhash 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 ubqhash verification cache into the provided folder. +func makecache(ctx *cli.Context) error { + args := ctx.Args() + if len(args) != 2 { + utils.Fatalf(`Usage: gubiq makecache `) + } + block, err := strconv.ParseUint(args[0], 0, 64) + if err != nil { + utils.Fatalf("Invalid block number: %v", err) + } + ubqhash.MakeCache(block, args[1]) + + return nil +} + +// makedag generates an ubqhash mining DAG into the provided folder. func makedag(ctx *cli.Context) error { args := ctx.Args() - wrongArgs := func() { + if len(args) != 2 { utils.Fatalf(`Usage: gubiq 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...") - ubqhash.MakeDataset(blockNum, dir) - } - default: - wrongArgs() + block, err := strconv.ParseUint(args[0], 0, 64) + if err != nil { + utils.Fatalf("Invalid block number: %v", err) } + ubqhash.MakeDataset(block, args[1]) + return nil } diff --git a/cmd/gubiq/usage.go b/cmd/gubiq/usage.go index 1053776eab..ce64fe852b 100644 --- a/cmd/gubiq/usage.go +++ b/cmd/gubiq/usage.go @@ -25,6 +25,7 @@ import ( "github.com/ubiq/go-ubiq/cmd/utils" "github.com/ubiq/go-ubiq/internal/debug" "gopkg.in/urfave/cli.v1" + "strings" ) // AppHelpTemplate is the test template for the default, global app help topic. @@ -80,6 +81,12 @@ var AppHelpFlagGroups = []flagGroup{ utils.LightKDFFlag, }, }, + {Name: "DEVELOPER CHAIN", + Flags: []cli.Flag{ + utils.DeveloperFlag, + utils.DeveloperPeriodFlag, + }, + }, { Name: "UBQHASH", Flags: []cli.Flag{ @@ -91,10 +98,22 @@ var AppHelpFlagGroups = []flagGroup{ utils.UbqhashDatasetsOnDiskFlag, }, }, + //{ + // Name: "DASHBOARD", + // Flags: []cli.Flag{ + // utils.DashboardEnabledFlag, + // utils.DashboardAddrFlag, + // utils.DashboardPortFlag, + // utils.DashboardRefreshFlag, + // utils.DashboardAssetsFlag, + // }, + //}, { Name: "TRANSACTION POOL", Flags: []cli.Flag{ utils.TxPoolNoLocalsFlag, + utils.TxPoolJournalFlag, + utils.TxPoolRejournalFlag, utils.TxPoolPriceLimitFlag, utils.TxPoolPriceBumpFlag, utils.TxPoolAccountSlotsFlag, @@ -260,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/p2psim/main.go b/cmd/p2psim/main.go new file mode 100644 index 0000000000..af50e13dd2 --- /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/ubiq/go-ubiq/crypto" + "github.com/ubiq/go-ubiq/p2p" + "github.com/ubiq/go-ubiq/p2p/discover" + "github.com/ubiq/go-ubiq/p2p/simulations" + "github.com/ubiq/go-ubiq/p2p/simulations/adapters" + "github.com/ubiq/go-ubiq/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/cmd/puppeth/module_dashboard.go b/cmd/puppeth/module_dashboard.go index 8d00823d37..4587101f89 100644 --- a/cmd/puppeth/module_dashboard.go +++ b/cmd/puppeth/module_dashboard.go @@ -199,7 +199,7 @@ var dashboardContent = `

The Ethereum Wallet is an Electron based desktop application to manage your Ethereum accounts and funds. Beside the usual account life-cycle operations you would expect to perform, the wallet also provides a means to send transactions from your accounts and to interact with smart contracts deployed on the network.

-

Under the hood the wallet is backed by a go-ubiq full node, meaning that a mid range machine is assumed. Similarly, synchronization is based on fast-sync, which will download all blockchain data from the network and make it available to the wallet. Light nodes cannot currently fully back the wallet, but it's a target actively pursued.

+

Under the hood the wallet is backed by a go-ethereum full node, meaning that a mid range machine is assumed. Similarly, synchronization is based on fast-sync, which will download all blockchain data from the network and make it available to the wallet. Light nodes cannot currently fully back the wallet, but it's a target actively pursued.


To connect with the Ethereum Wallet, you'll need to initialize your private network first via Gubiq as the wallet does not currently support calling Gubiq directly. To initialize your local chain, download {{.GubiqGenesis}} and run:

gubiq --datadir=$HOME/.{{.Network}} init {{.GubiqGenesis}}
@@ -220,7 +220,7 @@ var dashboardContent = `

The Mist browser is an Electron based desktop application to load and interact with Ethereum enabled third party web DApps. Beside all the functionality provided by the Ethereum Wallet, Mist is an extended web-browser where loaded pages have access to the Ubiq network via a web3.js provider, and may also interact with users' own accounts (given proper authorization and confirmation of course).

-

Under the hood the browser is backed by a go-ubiq full node, meaning that a mid range machine is assumed. Similarly, synchronization is based on fast-sync, which will download all blockchain data from the network and make it available to the wallet. Light nodes cannot currently fully back the wallet, but it's a target actively pursued.

+

Under the hood the browser is backed by a go-ethereum full node, meaning that a mid range machine is assumed. Similarly, synchronization is based on fast-sync, which will download all blockchain data from the network and make it available to the wallet. Light nodes cannot currently fully back the wallet, but it's a target actively pursued.


To connect with the Mist browser, you'll need to initialize your private network first via Gubiq as Mist does not currently support calling Gubiq directly. To initialize your local chain, download {{.GubiqGenesis}} and run:

gubiq --datadir=$HOME/.{{.Network}} init {{.GubiqGenesis}}
@@ -251,7 +251,7 @@ var dashboardContent = `

Starting with the 1.5 release of go-ubiq, we've transitioned away from shipping only full blown Ubiq clients and started focusing on releasing the code as reusable packages initially for Go projects, then later for Java based Android projects too. Mobile support is still evolving, hence is bound to change often and hard, but the Ubiq network can nonetheless be accessed from Android too.

-

Under the hood the Android library is backed by a go-ubiq light node, meaning that given a not-too-old Android device, you should be able to join the network without significant issues. Certain functionality is not yet available and rough edges are bound to appear here and there, please report issues if you find any.

+

Under the hood the Android library is backed by a go-ethereum light node, meaning that given a not-too-old Android device, you should be able to join the network without significant issues. Certain functionality is not yet available and rough edges are bound to appear here and there, please report issues if you find any.


The stable Android archives are distributed via Maven Central, and the develop snapshots via the Sonatype repositories. Before proceeding, please ensure you have a recent version configured in your Android project. You can find details in Mobile: Introduction – Android archive.

Before connecting to the Ubiq network, download the {{.GubiqGenesis}} genesis json file and either store it in your Android project as a resource file you can access, or save it as a string in a variable. You're going to need to to initialize your client.

@@ -282,7 +282,7 @@ node.start();

Starting with the 1.5 release of go-ubiq, we've transitioned away from shipping only full blown Ubiq clients and started focusing on releasing the code as reusable packages initially for Go projects, then later for ObjC/Swift based iOS projects too. Mobile support is still evolving, hence is bound to change often and hard, but the Ubiq network can nonetheless be accessed from iOS too.

-

Under the hood the iOS library is backed by a go-ubiq light node, meaning that given a not-too-old Apple device, you should be able to join the network without significant issues. Certain functionality is not yet available and rough edges are bound to appear here and there, please report issues if you find any.

+

Under the hood the iOS library is backed by a go-ethereum light node, meaning that given a not-too-old Apple device, you should be able to join the network without significant issues. Certain functionality is not yet available and rough edges are bound to appear here and there, please report issues if you find any.


Both stable and develop builds of the iOS framework are available via CocoaPods. Before proceeding, please ensure you have a recent version configured in your iOS project. You can find details in Mobile: Introduction – iOS framework.

Before connecting to the Ubiq network, download the {{.GubiqGenesis}} genesis json file and either store it in your iOS project as a resource file you can access, or save it as a string in a variable. You're going to need to to initialize your client.

@@ -324,7 +324,7 @@ try! node?.start();

Puppeth is distributed as part of the Gubiq & Tools bundles, but can also be installed separately via:

go get github.com/ubiq/go-ubiq/cmd/puppeth


-

Copyright 2017. The go-ubiq Authors.

+

Copyright 2017. The go-ethereum Authors.

@@ -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 fdec6388c6..3548fa192f 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}}], reserved: ["yournode"]};' > lib/utils/config.js CMD ["npm", "start"] ` @@ -59,25 +59,37 @@ 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: + max-size: "1m" + max-file: "10" restart: always ` // 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() @@ -87,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() @@ -107,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 @@ -145,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) @@ -155,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/module_faucet.go b/cmd/puppeth/module_faucet.go index a52dac93ed..b952a0e6d2 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 ` @@ -128,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_nginx.go b/cmd/puppeth/module_nginx.go index b7751eca7b..ca047d1711 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 6dd35c580e..12fe6cfd5e 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 '/gubiq init /genesis.json' > gubiq.sh && \{{if .Unlock}} + echo 'gubiq init /genesis.json' > gubiq.sh && \{{if .Unlock}} echo 'mkdir -p /root/.ubiq/keystore/ && cp /signer.json /root/.ubiq/keystore/' >> gubiq.sh && \{{end}} - echo $'/gubiq --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}}' >> gubiq.sh + echo $'gubiq --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}}' >> gubiq.sh ENTRYPOINT ["/bin/sh", "gubiq.sh"] ` @@ -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 ` @@ -123,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) @@ -192,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 /gubiq --exec admin.nodeInfo.id attach", network, kind)); err != nil { + if out, err = client.Run(fmt.Sprintf("docker exec %s_%s_1 gubiq --exec admin.nodeInfo.id attach", network, kind)); err != nil { return nil, ErrServiceUnreachable } id := bytes.Trim(bytes.TrimSpace(out), "\"") diff --git a/cmd/puppeth/ssh.go b/cmd/puppeth/ssh.go index 1fbf670818..fdf92e3426 100644 --- a/cmd/puppeth/ssh.go +++ b/cmd/puppeth/ssh.go @@ -27,7 +27,6 @@ import ( "os/user" "path/filepath" "strings" - "syscall" "github.com/ubiq/go-ubiq/log" "golang.org/x/crypto/ssh" @@ -78,14 +77,25 @@ 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)) } } 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 @@ -122,7 +132,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 37f20e84cf..008af067d6 100644 --- a/cmd/puppeth/wizard.go +++ b/cmd/puppeth/wizard.go @@ -22,12 +22,12 @@ import ( "fmt" "io/ioutil" "math/big" + "net" "os" "path/filepath" "sort" "strconv" "strings" - "syscall" "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/core" @@ -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 @@ -162,6 +160,29 @@ 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. func (w *wizard) readFloat() float64 { @@ -182,6 +203,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. @@ -207,15 +229,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(os.Stdin.Fd())) + 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 @@ -279,3 +299,27 @@ func (w *wizard) readJSON() string { return string(blob) } } + +// readIPAddress reads a single line from stdin, trimming if from spaces and +// 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("> ") + 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 "" + } + // Make sure it looks ok and return it if so + if ip := net.ParseIP(text); ip == nil { + log.Error("Invalid IP address, please retry") + continue + } + return text + } +} diff --git a/cmd/puppeth/wizard_ethstats.go b/cmd/puppeth/wizard_ethstats.go index 3afb4a67e7..85636bcb04 100644 --- a/cmd/puppeth/wizard_ethstats.go +++ b/cmd/puppeth/wizard_ethstats.go @@ -18,6 +18,7 @@ package main import ( "fmt" + "sort" "github.com/ubiq/go-ubiq/log" ) @@ -60,6 +61,42 @@ 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" { + // The user might want to clear the entire list, although generally probably not + fmt.Println() + 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 != "" { + 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)) for _, client := range w.servers { @@ -67,7 +104,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) diff --git a/cmd/puppeth/wizard_genesis.go b/cmd/puppeth/wizard_genesis.go index ba275f3b9b..473bd41029 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" @@ -42,6 +44,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 @@ -134,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 54328ae9fb..9091c5bfff 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 a5ff0d655e..1afdf7a4c3 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) diff --git a/cmd/puppeth/wizard_network.go b/cmd/puppeth/wizard_network.go index 7314f4e308..7f5ce44bd0 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 dial 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, diff --git a/cmd/rlpdump/main.go b/cmd/rlpdump/main.go index 0322440799..0ecfc72820 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) } diff --git a/cmd/swarm/cleandb.go b/cmd/swarm/cleandb.go deleted file mode 100644 index 92d4497658..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/ubiq/go-ubiq/cmd/utils" - "github.com/ubiq/go-ubiq/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..3aaa1a4d55 --- /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/ubiq/go-ubiq/cmd/utils" + "github.com/ubiq/go-ubiq/log" + "github.com/ubiq/go-ubiq/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 6049b21d40..07e4eab236 100644 --- a/cmd/swarm/main.go +++ b/cmd/swarm/main.go @@ -25,6 +25,7 @@ import ( "os" "os/signal" "runtime" + "sort" "strconv" "strings" "syscall" @@ -234,15 +235,69 @@ 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 ~/.ubiq/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 ~/.ubiq/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 ~/.ubiq/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 ~/.ubiq/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'. `, }, } + sort.Sort(cli.CommandsByName(app.Commands)) app.Flags = []cli.Flag{ utils.IdentityFlag, diff --git a/cmd/swarm/run_test.go b/cmd/swarm/run_test.go index 6b02ebdf69..d671219393 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/cmd/utils/cmd.go b/cmd/utils/cmd.go index 64bd5808ec..9853948171 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/cmd/utils/flags.go b/cmd/utils/flags.go index 43f1b23b0e..4c21f6ea8b 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -31,18 +31,19 @@ import ( "github.com/ubiq/go-ubiq/accounts" "github.com/ubiq/go-ubiq/accounts/keystore" "github.com/ubiq/go-ubiq/common" - "github.com/ubiq/go-ubiq/common/fdlimit" + "github.com/ubiq/go-ubiq/consensus" + "github.com/ubiq/go-ubiq/consensus/clique" "github.com/ubiq/go-ubiq/consensus/ubqhash" "github.com/ubiq/go-ubiq/core" "github.com/ubiq/go-ubiq/core/state" "github.com/ubiq/go-ubiq/core/vm" "github.com/ubiq/go-ubiq/crypto" + "github.com/ubiq/go-ubiq/dashboard" "github.com/ubiq/go-ubiq/eth" "github.com/ubiq/go-ubiq/eth/downloader" "github.com/ubiq/go-ubiq/eth/gasprice" "github.com/ubiq/go-ubiq/ethdb" "github.com/ubiq/go-ubiq/ethstats" - "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/les" "github.com/ubiq/go-ubiq/log" "github.com/ubiq/go-ubiq/metrics" @@ -122,7 +123,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", @@ -133,9 +134,13 @@ var ( Name: "testnet", Usage: "Pre-configured proof-of-work test network (legacy)", } - 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", @@ -175,6 +180,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, + } // Ubqhash settings UbqhashCacheDirFlag = DirectoryFlag{ Name: "ubqhash.cachedir", @@ -210,6 +240,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", @@ -293,7 +333,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: "", } @@ -666,7 +706,7 @@ func setIPC(ctx *cli.Context, cfg *node.Config) { } // makeDatabaseHandles raises out the number of allowed file handles per process -// for Geth and returns half of the allowance to assign to the database. +// for Gubiq and returns half of the allowance to assign to the database. func makeDatabaseHandles() int { limit, err := fdlimit.Maximum() if err != nil { @@ -773,7 +813,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" @@ -794,8 +834,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") } @@ -824,6 +864,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) } @@ -893,7 +939,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) + checkExclusive(ctx, DeveloperFlag, TestnetFlag) checkExclusive(ctx, FastSyncFlag, LightModeFlag, SyncModeFlag) ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) @@ -919,11 +965,6 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { if ctx.GlobalIsSet(NetworkIdFlag.Name) { cfg.NetworkId = ctx.GlobalUint64(NetworkIdFlag.Name) } - - // Ethereum needs to know maxPeers to calculate the light server peer ratio. - // TODO(fjl): ensure Ubiq can get MaxPeers from node. - cfg.MaxPeers = ctx.GlobalInt(MaxPeersFlag.Name) - if ctx.GlobalIsSet(CacheFlag.Name) { cfg.DatabaseCache = ctx.GlobalInt(CacheFlag.Name) } @@ -953,20 +994,44 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { cfg.NetworkId = 9 } cfg.Genesis = core.DefaultTestnetGenesisBlock() - 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) } } +// 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 Ubiq client to the stack. func RegisterEthService(stack *node.Node, cfg *eth.Config) { var err error @@ -989,6 +1054,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) { @@ -1043,8 +1115,8 @@ func MakeGenesis(ctx *cli.Context) *core.Genesis { switch { case ctx.GlobalBool(TestnetFlag.Name): genesis = core.DefaultTestnetGenesisBlock() - case ctx.GlobalBool(DevModeFlag.Name): - genesis = core.DevGenesisBlock() + case ctx.GlobalBool(DeveloperFlag.Name): + Fatalf("Developer chains are ephemeral") } return genesis } @@ -1054,16 +1126,24 @@ func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chai var err error chainDb = MakeChainDatabase(ctx, stack) - engine := ubqhash.NewFaker() - if !ctx.GlobalBool(FakePoWFlag.Name) { - engine = ubqhash.New("", 1, 0, "", 1, 0) - } 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 = ubqhash.NewFaker() + if !ctx.GlobalBool(FakePoWFlag.Name) { + engine = ubqhash.New( + stack.ResolvePath(eth.DefaultConfig.UbqhashCacheDir), eth.DefaultConfig.UbqhashCachesInMem, eth.DefaultConfig.UbqhashCachesOnDisk, + stack.ResolvePath(eth.DefaultConfig.UbqhashDatasetDir), eth.DefaultConfig.UbqhashDatasetsInMem, eth.DefaultConfig.UbqhashDatasetsOnDisk, + ) + } + } 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/common/bitutil/compress_test.go b/common/bitutil/compress_test.go index 88ce78cbeb..045f298192 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/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/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 943288fad3..fbc21241c8 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. @@ -224,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/common/types.go b/common/types.go index ebb50b7a39..d5d371543c 100644 --- a/common/types.go +++ b/common/types.go @@ -24,6 +24,7 @@ import ( "reflect" "github.com/ubiq/go-ubiq/common/hexutil" + "github.com/ubiq/go-ubiq/crypto/sha3" ) const ( @@ -87,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:] @@ -96,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 @@ -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 { 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() + } +} diff --git a/consensus/clique/clique.go b/consensus/clique/clique.go index 8943db604f..a30254d51e 100644 --- a/consensus/clique/clique.go +++ b/consensus/clique/clique.go @@ -29,6 +29,7 @@ import ( "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/common/hexutil" "github.com/ubiq/go-ubiq/consensus" + "github.com/ubiq/go-ubiq/consensus/misc" "github.com/ubiq/go-ubiq/core/state" "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/crypto" @@ -124,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 @@ -210,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) @@ -313,6 +316,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) } @@ -594,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.go b/consensus/clique/snapshot.go index 38f895de62..03a3ff7a74 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 diff --git a/consensus/clique/snapshot_test.go b/consensus/clique/snapshot_test.go index f3182bca8d..e4f9fd64fe 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.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/consensus/ubqhash/algorithm.go b/consensus/ubqhash/algorithm.go index f05fa0234a..3f2c219365 100644 --- a/consensus/ubqhash/algorithm.go +++ b/consensus/ubqhash/algorithm.go @@ -106,7 +106,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 @@ -195,7 +195,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 @@ -295,7 +295,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 diff --git a/consensus/ubqhash/algorithm_go1.8.go b/consensus/ubqhash/algorithm_go1.8.go index de03037bc9..5e293baf1a 100644 --- a/consensus/ubqhash/algorithm_go1.8.go +++ b/consensus/ubqhash/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/console/bridge.go b/console/bridge.go index bbc8664f9f..7a658ffbbb 100644 --- a/console/bridge.go +++ b/console/bridge.go @@ -23,6 +23,7 @@ import ( "strings" "time" + "github.com/ubiq/go-ubiq/accounts/usbwallet" "github.com/ubiq/go-ubiq/log" "github.com/ubiq/go-ubiq/rpc" "github.com/robertkrimen/otto" @@ -83,6 +84,49 @@ 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, "7 | 8 | 9\n") + fmt.Fprintf(b.printer, "--+---+--\n") + fmt.Fprintf(b.printer, "4 | 5 | 6\n") + fmt.Fprintf(b.printer, "--+---+--\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 { + 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 8dcbccd15a..a987a57026 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/console/console_test.go b/console/console_test.go index 50c7016093..2a1e101b78 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. @@ -96,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/containers/docker/master-alpine/Dockerfile b/containers/docker/master-alpine/Dockerfile index f5df62f80e..b9a55eeef6 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/ubiq/go-ubiq && \ + git clone --depth 1 --branch release/1.7 https://github.com/ubiq/go-ubiq && \ (cd go-ubiq && make gubiq) && \ cp go-ubiq/build/bin/gubiq /gubiq && \ 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 8ae48363f5..e56604e813 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/ubiq/go-ubiq && \ + git clone --depth 1 --branch release/1.7 https://github.com/ubiq/go-ubiq && \ (cd go-ubiq && make gubiq) && \ cp go-ubiq/build/bin/gubiq /gubiq && \ apt-get remove -y golang git make gcc libc-dev && apt autoremove -y && apt-get clean && \ diff --git a/contracts/chequebook/cheque.go b/contracts/chequebook/cheque.go index c8a6088404..07462b5f1e 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 1ab4286519..9127ff4378 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) } } @@ -233,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 @@ -244,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 @@ -260,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 @@ -278,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) @@ -297,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) @@ -320,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) @@ -331,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) @@ -353,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()) } } diff --git a/contracts/chequebook/contract/chequebook.sol b/contracts/chequebook/contract/chequebook.sol index eefe6c0637..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,25 +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. - 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])) { - // 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); } } } 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..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 } @@ -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) diff --git a/core/bench_test.go b/core/bench_test.go index f7bd30d19c..dfe9a9e381 100644 --- a/core/bench_test.go +++ b/core/bench_test.go @@ -30,7 +30,6 @@ import ( "github.com/ubiq/go-ubiq/core/vm" "github.com/ubiq/go-ubiq/crypto" "github.com/ubiq/go-ubiq/ethdb" - "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/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, ubqhash.NewFaker(), evmux, vm.Config{}) + chainman, _ := NewBlockChain(db, gspec.Config, ubqhash.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, ubqhash.NewFaker(), new(event.TypeMux), vm.Config{}) + chain, err := NewBlockChain(db, params.TestChainConfig, ubqhash.NewFaker(), vm.Config{}) if err != nil { b.Fatalf("error creating chain: %v", err) } @@ -300,6 +298,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 e905cab9d1..f4afce0d0f 100644 --- a/core/block_validator_test.go +++ b/core/block_validator_test.go @@ -25,7 +25,6 @@ import ( "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/core/vm" "github.com/ubiq/go-ubiq/ethdb" - "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/params" ) @@ -43,7 +42,8 @@ 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, ubqhash.NewFaker(), new(event.TypeMux), vm.Config{}) + chain, _ := NewBlockChain(testdb, params.TestChainConfig, ubqhash.NewFaker(), vm.Config{}) + defer chain.Stop() for i := 0; i < len(blocks); i++ { for j, valid := range []bool{true, false} { @@ -106,11 +106,13 @@ func testHeaderConcurrentVerification(t *testing.T, threads int) { var results <-chan error if valid { - chain, _ := NewBlockChain(testdb, params.TestChainConfig, ubqhash.NewFaker(), new(event.TypeMux), vm.Config{}) + chain, _ := NewBlockChain(testdb, params.TestChainConfig, ubqhash.NewFaker(), vm.Config{}) _, results = chain.engine.VerifyHeaders(chain, headers, seals) + chain.Stop() } else { - chain, _ := NewBlockChain(testdb, params.TestChainConfig, ubqhash.NewFakeFailer(uint64(len(headers)-1)), new(event.TypeMux), vm.Config{}) + chain, _ := NewBlockChain(testdb, params.TestChainConfig, ubqhash.NewFakeFailer(uint64(len(headers)-1)), vm.Config{}) _, results = chain.engine.VerifyHeaders(chain, headers, seals) + chain.Stop() } // Wait for all the verification results checks := make(map[int]error) @@ -171,7 +173,9 @@ func testHeaderConcurrentAbortion(t *testing.T, threads int) { defer runtime.GOMAXPROCS(old) // Start the verifications and immediately abort - chain, _ := NewBlockChain(testdb, params.TestChainConfig, ubqhash.NewFakeDelayer(time.Millisecond), new(event.TypeMux), vm.Config{}) + chain, _ := NewBlockChain(testdb, params.TestChainConfig, ubqhash.NewFakeDelayer(time.Millisecond), vm.Config{}) + defer chain.Stop() + abort, results := chain.engine.VerifyHeaders(chain, headers, seals) close(abort) diff --git a/core/blockchain.go b/core/blockchain.go index b77db34ed1..54a92c672a 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" @@ -79,10 +78,15 @@ 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 + 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 +119,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 +130,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, @@ -511,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 @@ -602,6 +608,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) @@ -695,114 +703,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 := 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) - 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 { @@ -813,16 +780,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() @@ -840,36 +809,75 @@ 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 // 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 { 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 -// 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() { @@ -877,7 +885,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]) } } @@ -894,6 +902,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 @@ -917,7 +926,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() @@ -938,7 +947,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++ @@ -952,7 +961,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. @@ -964,58 +973,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 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 + 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))) + coalescedLogs = append(coalescedLogs, logs...) blockInsertTimer.UpdateSince(bstart) events = append(events, ChainEvent{block, block.Hash(), logs}) + lastCanon = block - // 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 - 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 - } 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())) @@ -1027,9 +1013,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. @@ -1169,11 +1157,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()...) } @@ -1184,19 +1167,13 @@ 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.eventMux.Post(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}) } }() } @@ -1204,22 +1181,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) } } @@ -1366,8 +1346,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 @@ -1402,9 +1382,27 @@ 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 } -// BigIntSlice attaches the methods of sort.Interface to []*big.Int, sorting in increasing order. -type BigIntSlice []*big.Int +// SubscribeRemovedLogsEvent registers a subscription of RemovedLogsEvent. +func (bc *BlockChain) SubscribeRemovedLogsEvent(ch chan<- RemovedLogsEvent) event.Subscription { + return bc.scope.Track(bc.rmLogsFeed.Subscribe(ch)) +} -func (s BigIntSlice) Len() int { return len(s) } -func (s BigIntSlice) Less(i, j int) bool { return s[i].Cmp(s[j]) < 0 } -func (s BigIntSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +// 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 1ae07d4aa6..038216daab 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -20,6 +20,7 @@ import ( "fmt" "math/big" "math/rand" + "sync" "testing" "time" @@ -30,7 +31,6 @@ import ( "github.com/ubiq/go-ubiq/core/vm" "github.com/ubiq/go-ubiq/crypto" "github.com/ubiq/go-ubiq/ethdb" - "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/params" ) @@ -46,7 +46,7 @@ func newTestBlockChain(fake bool) *BlockChain { if !fake { engine = ubqhash.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) } @@ -61,6 +61,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 +184,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 +206,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 +234,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 +264,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 +294,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 +321,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 +399,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 +444,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 +469,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) @@ -479,10 +496,12 @@ 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, ubqhash.NewFaker(), new(event.TypeMux), vm.Config{}) + ncm, err := NewBlockChain(bc.chainDb, bc.config, ubqhash.NewFaker(), vm.Config{}) 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 +527,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 @@ -588,16 +609,17 @@ 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, ubqhash.NewFaker(), new(event.TypeMux), vm.Config{}) + archive, _ := NewBlockChain(archiveDb, gspec.Config, ubqhash.NewFaker(), 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, ubqhash.NewFaker(), new(event.TypeMux), vm.Config{}) + fast, _ := NewBlockChain(fastDb, gspec.Config, ubqhash.NewFaker(), vm.Config{}) + defer fast.Stop() headers := make([]*types.Header, len(blocks)) for i, block := range blocks { @@ -674,10 +696,12 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { archiveDb, _ := ethdb.NewMemDatabase() gspec.MustCommit(archiveDb) - archive, _ := NewBlockChain(archiveDb, gspec.Config, ubqhash.NewFaker(), new(event.TypeMux), vm.Config{}) + archive, _ := NewBlockChain(archiveDb, gspec.Config, ubqhash.NewFaker(), vm.Config{}) 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) @@ -685,7 +709,8 @@ 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, ubqhash.NewFaker(), new(event.TypeMux), vm.Config{}) + fast, _ := NewBlockChain(fastDb, gspec.Config, ubqhash.NewFaker(), vm.Config{}) + defer fast.Stop() headers := make([]*types.Header, len(blocks)) for i, block := range blocks { @@ -705,10 +730,12 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { lightDb, _ := ethdb.NewMemDatabase() gspec.MustCommit(lightDb) - light, _ := NewBlockChain(lightDb, gspec.Config, ubqhash.NewFaker(), new(event.TypeMux), vm.Config{}) + light, _ := NewBlockChain(lightDb, gspec.Config, ubqhash.NewFaker(), vm.Config{}) 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) @@ -772,11 +799,11 @@ func TestChainTxReorgs(t *testing.T) { } }) // Import the chain. This runs all block validation rules. - evmux := &event.TypeMux{} - blockchain, _ := NewBlockChain(db, gspec.Config, ubqhash.NewFaker(), evmux, vm.Config{}) + blockchain, _ := NewBlockChain(db, gspec.Config, ubqhash.NewFaker(), vm.Config{}) 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) { @@ -843,10 +870,11 @@ func TestLogReorgs(t *testing.T) { signer = types.NewEIP155Signer(gspec.Config.ChainId) ) - var evmux event.TypeMux - blockchain, _ := NewBlockChain(db, gspec.Config, ubqhash.NewFaker(), &evmux, vm.Config{}) + blockchain, _ := NewBlockChain(db, gspec.Config, ubqhash.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) @@ -865,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.") } } @@ -884,8 +917,8 @@ func TestReorgSideEvent(t *testing.T) { signer = types.NewEIP155Signer(gspec.Config.ChainId) ) - evmux := &event.TypeMux{} - blockchain, _ := NewBlockChain(db, gspec.Config, ubqhash.NewFaker(), evmux, vm.Config{}) + blockchain, _ := NewBlockChain(db, gspec.Config, ubqhash.NewFaker(), vm.Config{}) + defer blockchain.Stop() chain, _ := GenerateChain(gspec.Config, genesis, db, 3, func(i int, gen *BlockGen) {}) if _, err := blockchain.InsertChain(chain); err != nil { @@ -895,14 +928,15 @@ 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) } gen.AddTx(tx) }) - subs := evmux.Subscribe(ChainSideEvent{}) + chainSideCh := make(chan ChainSideEvent, 64) + blockchain.SubscribeChainSideEvent(chainSideCh) if _, err := blockchain.InsertChain(replacementBlocks); err != nil { t.Fatalf("failed to insert chain: %v", err) } @@ -925,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()) } @@ -946,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): } @@ -955,11 +989,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 +1021,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) { @@ -997,10 +1041,11 @@ 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, ubqhash.NewFaker(), &mux, vm.Config{}) + blockchain, _ := NewBlockChain(db, gspec.Config, ubqhash.NewFaker(), vm.Config{}) + defer blockchain.Stop() + blocks, _ := GenerateChain(gspec.Config, genesis, db, 4, func(i int, block *BlockGen) { var ( tx *types.Transaction @@ -1104,10 +1149,11 @@ func TestEIP161AccountRemoval(t *testing.T) { }, Alloc: GenesisAlloc{address: {Balance: funds}}, } - genesis = gspec.MustCommit(db) - mux event.TypeMux - blockchain, _ = NewBlockChain(db, gspec.Config, ubqhash.NewFaker(), &mux, vm.Config{}) + genesis = gspec.MustCommit(db) ) + blockchain, _ := NewBlockChain(db, gspec.Config, ubqhash.NewFaker(), 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/filter_test.go b/core/bloombits/doc.go similarity index 85% rename from core/filter_test.go rename to core/bloombits/doc.go index 58e71e305d..3d159e74f7 100644 --- a/core/filter_test.go +++ b/core/bloombits/doc.go @@ -1,4 +1,4 @@ -// Copyright 2014 The go-ethereum Authors +// 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 @@ -14,4 +14,5 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package core +// Package bloombits implements bloom filtering on batches of data. +package bloombits diff --git a/core/bloombits/generator.go b/core/bloombits/generator.go new file mode 100644 index 0000000000..6870e77f71 --- /dev/null +++ b/core/bloombits/generator.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 bloombits + +import ( + "errors" + + "github.com/ubiq/go-ubiq/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(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 + byteIndex := b.nextBit / 8 + bitMask := byte(1) << byte(7-b.nextBit%8) + + for i := 0; i < types.BloomBitLength; i++ { + bloomByteIndex := types.BloomByteLength - 1 - i/8 + bloomBitMask := byte(1) << byte(i%8) + + if (bloom[bloomByteIndex] & bloomBitMask) != 0 { + b.blooms[i][byteIndex] |= 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..f4279e9f8c --- /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/ubiq/go-ubiq/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(uint(i), 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 new file mode 100644 index 0000000000..b33cea53a6 --- /dev/null +++ b/core/bloombits/matcher.go @@ -0,0 +1,650 @@ +// 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" + "context" + "errors" + "math" + "sort" + "sync" + "sync/atomic" + "time" + + "github.com/ubiq/go-ubiq/common/bitutil" + "github.com/ubiq/go-ubiq/crypto" +) + +// bloomIndexes represents the bit indexes inside the bloom filter that belong +// to some key. +type bloomIndexes [3]uint + +// calcBloomIndexes returns the bloom filter bit indexes belonging to the given key. +func calcBloomIndexes(b []byte) bloomIndexes { + b = crypto.Keccak256(b) + + 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 +} + +// 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. +// +// 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 + + Context context.Context + Error error +} + +// 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 { + sectionSize uint64 // Size of the data batches to filter on + + 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 + 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 pipeline for retrieving bloom bit streams and doing +// 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{ + 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), + } + // Calculate the bloom bit indexes for the groups we're interested in + 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) + } + // 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 { + 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 +// 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 + } + m.schedulers[idx] = newScheduler(idx) +} + +// 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(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") + } + defer atomic.StoreUint32(&m.running, 0) + + // Initiate a new matching round + session := &MatcherSession{ + matcher: m, + quit: make(chan struct{}), + kill: make(chan struct{}), + ctx: ctx, + } + for _, scheduler := range m.schedulers { + scheduler.reset() + } + sink := m.run(begin, end, cap(results), session) + + // Read the output from the result sink and deliver to the user + session.pend.Add(1) + go func() { + defer session.pend.Done() + defer close(results) + + for { + select { + case <-session.quit: + return + + 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++ { + // 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 { + if i%8 == 0 { + i += 7 + } + continue + } + // Some bit it set, do the actual submatching + if bit := 7 - i%8; next&(1<= 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 + } + } + } +} + +// MatcherSession is returned by a started matcher to be used as a terminator +// for the actively running matching operation. +type MatcherSession struct { + matcher *Matcher + + 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.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() + }) +} + +// Error returns any failure encountered during the matching session. +func (s *MatcherSession) Error() 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 +// 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 + } +} + +// 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 + } + } + // Allocate as much as we can handle and request servicing + sections := s.AllocateSections(bit, batch) + request := make(chan *Retrieval) + + select { + case <-s.quit: + // Session terminating, we can't meaningfully service, abort + s.DeliverSections(bit, sections, make([][]byte, len(sections))) + return + + case mux <- request: + // Retrieval accepted, something must arrive before we're aborting + request <- &Retrieval{Bit: bit, Sections: sections, Context: s.ctx} + + result := <-request + if result.Error != nil { + s.err.Store(result.Error) + s.Close() + } + s.DeliverSections(result.Bit, result.Sections, result.Bitsets) + } + } +} diff --git a/core/bloombits/matcher_test.go b/core/bloombits/matcher_test.go new file mode 100644 index 0000000000..dd9e46b21c --- /dev/null +++ b/core/bloombits/matcher_test.go @@ -0,0 +1,286 @@ +// 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 ( + "context" + "math/rand" + "sync/atomic" + "testing" + "time" + + "github.com/ubiq/go-ubiq/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{ + {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) + } + 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}}}, 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}}}, 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), 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/ubiq/go-ubiq/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, 0, 10000, 0) +} + +// makeRandomIndexes generates a random filter system, composed on multiple filter +// 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)) + 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) + } + } + } + return res +} + +// 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, 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) + } +} + +// 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, 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) + } +} + +// 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, 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 + + 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(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 := start; 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() + close(quit) + + quit = make(chan struct{}) + matches = make(chan uint64, 16) + + session, err = matcher.Start(context.Background(), 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() + 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..70772e4ab9 --- /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{ + {}, + 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/chain_indexer.go b/core/chain_indexer.go new file mode 100644 index 0000000000..d4fafd4c25 --- /dev/null +++ b/core/chain_indexer.go @@ -0,0 +1,445 @@ +// 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 ( + "encoding/binary" + "fmt" + "sync" + "sync/atomic" + "time" + + "github.com/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/core/types" + "github.com/ubiq/go-ubiq/ethdb" + "github.com/ubiq/go-ubiq/event" + "github.com/ubiq/go-ubiq/log" +) + +// 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 initiates the processing of a new chain segment, potentially terminating + // any partially completed operations (in case of a reorg). + 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. + 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 +// 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, + update: make(chan struct{}, 1), + quit: make(chan chan error), + sectionSize: section, + confirmsReq: confirm, + throttling: throttling, + log: log.New("type", kind), + } + // Initialize database dependent fields and start the updater + c.loadValidSections() + go c.updateLoop() + + 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) +} + +// 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 ChainIndexerChain) { + events := make(chan ChainEvent, 10) + sub := chain.SubscribeChainEvent(events) + + go c.eventLoop(chain.CurrentHeader(), events, sub) +} + +// 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) + } + } + // 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: + 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, events chan ChainEvent, sub event.Subscription) { + // Mark the chain indexer as active, requiring an additional teardown + atomic.StoreUint32(&c.active, 1) + + 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 := <-events: + // Received a new event, ensure it's not nil (closing) and update + if !ok { + errc := <-c.quit + errc <- nil + return + } + 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) + } + } + 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() { + var ( + updating bool + updated time.Time + ) + + for { + select { + case errc := <-c.quit: + // Chain indexer terminating, report no failure and abort + errc <- nil + return + + case <-c.update: + // Section headers completed (or rolled back), update the index + c.lock.Lock() + 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 { + updating = true + c.log.Info("Upgrading chain index", "percentage", c.storedSections*100/c.knownSections) + } + updated = time.Now() + } + // 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() + 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) { + c.setSectionHead(section, newHead) + c.setValidSections(section + 1) + if c.storedSections == c.knownSections && updating { + updating = false + c.log.Info("Finished upgrading chain index") + } + + 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 failed, don't retry until further notification + c.log.Debug("Chain index processing failed", "section", section, "err", err) + c.knownSections = c.storedSections + } + } + // 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() + } + } +} + +// 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 + + 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) + 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(); err != nil { + c.log.Error("Section commit failed", "error", err) + 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(indexer *ChainIndexer) { + c.lock.Lock() + defer c.lock.Unlock() + + c.children = append(c.children, indexer) + + // Cascade any pending updates to new children too + if c.storedSections > 0 { + indexer.newHead(c.storedSections*c.sectionSize-1, false) + } +} + +// 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 { + c.storedSections = binary.BigEndian.Uint64(data[:]) + } +} + +// setValidSections writes the number of valid sections to the index database +func (c *ChainIndexer) setValidSections(sections uint64) { + // Set the current number of valid sections in the database + var data [8]byte + 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 +} + +// 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[:], section) + + 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(section uint64, hash common.Hash) { + var data [8]byte + binary.BigEndian.PutUint64(data[:], section) + + 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(section uint64) { + var data [8]byte + 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 new file mode 100644 index 0000000000..ed0c502c34 --- /dev/null +++ b/core/chain_indexer_test.go @@ -0,0 +1,236 @@ +// 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 ( + "fmt" + "math/big" + "math/rand" + "testing" + "time" + + "github.com/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/core/types" + "github.com/ubiq/go-ubiq/ethdb" +) + +// Runs multiple tests with randomized parameters. +func TestChainIndexerSingle(t *testing.T) { + 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) { + for i := 2; i < 8; i++ { + testChainIndexer(t, i) + } +} + +// 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() + defer db.Close() + + // 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)) + + 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) + } + } + 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) { + backends[0].indexer.newHead(headNum, reorg) + if reorg { + for _, backend := range backends { + headNum = backend.reorg(headNum) + backend.assertSections() + } + 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++ { + inject(i) + } + notify(100, 100, false) + + // Add new blocks one by one + for i := uint64(101); i <= 1000; i++ { + inject(i) + notify(i, i, false) + } + // 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 reorg (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++ { + inject(i) + notify(i, i, false) + } +} + +// testChainIndexBackend implements ChainIndexerBackend +type testChainIndexBackend struct { + t *testing.T + indexer *ChainIndexer + section, headerCnt, stored uint64 + processCh chan uint64 +} + +// 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 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 + 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(10 * time.Millisecond) + } + if updating { + b.t.Fatalf("update did not finish") + } + sections = expectd / b.indexer.sectionSize + break + } + select { + case <-time.After(10 * time.Second): + 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) + } + } + } + b.stored = sections + } + } + if b.stored == 0 { + return 0, false + } + return b.stored*b.indexer.sectionSize - 1, true +} + +func (b *testChainIndexBackend) reorg(headNum uint64) uint64 { + firstChanged := headNum / b.indexer.sectionSize + if firstChanged < b.stored { + b.stored = firstChanged + } + return b.stored * b.indexer.sectionSize +} + +func (b *testChainIndexBackend) Reset(section uint64, prevHead common.Hash) error { + b.section = section + b.headerCnt = 0 + return nil +} + +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): + b.t.Fatal("Unexpected call to Process") + case b.processCh <- header.Number.Uint64(): + } +} + +func (b *testChainIndexBackend) Commit() error { + if b.headerCnt != b.indexer.sectionSize { + b.t.Error("Not enough headers processed") + } + return nil +} diff --git a/core/chain_makers.go b/core/chain_makers.go index b06da3e573..a18538082d 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -22,11 +22,11 @@ import ( "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/consensus/ubqhash" + "github.com/ubiq/go-ubiq/consensus/misc" "github.com/ubiq/go-ubiq/core/state" "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/core/vm" "github.com/ubiq/go-ubiq/ethdb" - "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/params" ) @@ -168,7 +168,7 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, db ethdb.Dat if gen != nil { gen(i, b) } - ubqhash.AccumulateRewards(statedb, h, b.uncles) + ubqhash.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)) @@ -202,7 +202,12 @@ func makeHeader(config *params.ChainConfig, parent *types.Block, state *state.St Root: state.IntermediateRoot(config.IsEIP158(parent.Number())), ParentHash: parent.Hash(), Coinbase: parent.Coinbase(), - Difficulty: ubqhash.CalcDifficultyLegacy(time.Uint64(), new(big.Int).Sub(time, big.NewInt(10)).Uint64(), parent.Number(), parent.Difficulty()), + Difficulty: ubqhash.CalcDifficultyLegacy(config, time.Uint64(), &types.Header{ + 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), Number: new(big.Int).Add(parent.Number(), common.Big1), @@ -219,7 +224,7 @@ func newCanonical(n int, full bool) (ethdb.Database, *BlockChain, error) { db, _ := ethdb.NewMemDatabase() genesis := gspec.MustCommit(db) - blockchain, _ := NewBlockChain(db, params.AllProtocolChanges, ubqhash.NewFaker(), new(event.TypeMux), vm.Config{}) + blockchain, _ := NewBlockChain(db, params.AllUbqhashProtocolChanges, ubqhash.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 cc0c6585d7..34ad895465 100644 --- a/core/chain_makers_test.go +++ b/core/chain_makers_test.go @@ -25,7 +25,6 @@ import ( "github.com/ubiq/go-ubiq/core/vm" "github.com/ubiq/go-ubiq/crypto" "github.com/ubiq/go-ubiq/ethdb" - "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/params" ) @@ -80,8 +79,9 @@ func ExampleGenerateChain() { }) // Import the chain. This runs all block validation rules. - evmux := &event.TypeMux{} - blockchain, _ := NewBlockChain(db, gspec.Config, ubqhash.NewFaker(), evmux, vm.Config{}) + blockchain, _ := NewBlockChain(db, gspec.Config, ubqhash.NewFaker(), 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/database_util.go b/core/database_util.go index b20993727f..7761212f61 100644 --- a/core/database_util.go +++ b/core/database_util.go @@ -23,7 +23,6 @@ import ( "errors" "fmt" "math/big" - "sync" "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/core/types" @@ -34,24 +33,36 @@ import ( "github.com/ubiq/go-ubiq/rlp" ) +// DatabaseReader wraps the Get method of a backing data store. +type DatabaseReader interface { + Get(key []byte) (value []byte, err 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 - mipmapPre = []byte("mipmap-log-bloom-") - MIPMapLevels = []uint64{1000000, 500000, 100000, 50000, 1000} + preimagePrefix = "secure-key-" // preimagePrefix + hash -> preimage + configPrefix = []byte("ubiq-config-") // config prefix for the db - configPrefix = []byte("ubiq-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-") @@ -59,15 +70,13 @@ 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") ) -// 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 @@ -81,7 +90,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{} @@ -95,7 +104,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 @@ -108,7 +117,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{} @@ -117,7 +126,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{} @@ -129,7 +138,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{} @@ -139,14 +148,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 { - data, _ := db.Get(append(append(headerPrefix, encodeBlockNumber(number)...), hash.Bytes()...)) +func GetHeaderRLP(db DatabaseReader, hash common.Hash, number uint64) rlp.RawValue { + data, _ := db.Get(headerKey(hash, number)) 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 @@ -160,14 +169,22 @@ 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()...)) +func GetBodyRLP(db DatabaseReader, hash common.Hash, number uint64) rlp.RawValue { + 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 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 @@ -182,7 +199,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 @@ -201,7 +218,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 { @@ -217,7 +234,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 @@ -236,14 +253,14 @@ 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 { 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 @@ -253,7 +270,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) @@ -266,7 +283,6 @@ func GetTransaction(db ethdb.Database, hash common.Hash) (*types.Transaction, co return body.Transactions[txIndex], blockHash, blockNumber, txIndex } // Old transaction representation, load the transaction and it's metadata separately - // Retrieve the transaction itself from the database data, _ := db.Get(hash.Bytes()) if len(data) == 0 { return nil, common.Hash{}, 0, 0 @@ -280,7 +296,7 @@ func GetTransaction(db ethdb.Database, 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 } @@ -289,7 +305,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) @@ -314,8 +330,19 @@ 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, error) { + key := append(append(bloomBitsPrefix, make([]byte, 10)...), head.Bytes()...) + + binary.BigEndian.PutUint16(key[1:], uint16(bit)) + binary.BigEndian.PutUint64(key[3:], section) + + return db.Get(key) +} + // WriteCanonicalHash stores the canonical hash for the given block number. -func WriteCanonicalHash(db ethdb.Database, 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) @@ -324,7 +351,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 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) } @@ -332,7 +359,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 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) } @@ -340,7 +367,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 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) } @@ -348,7 +375,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 ethdb.Putter, header *types.Header) error { data, err := rlp.EncodeToBytes(header) if err != nil { return err @@ -368,7 +395,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 ethdb.Putter, hash common.Hash, number uint64, body *types.Body) error { data, err := rlp.EncodeToBytes(body) if err != nil { return err @@ -377,7 +404,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 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) @@ -386,7 +413,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 ethdb.Putter, hash common.Hash, number uint64, td *big.Int) error { data, err := rlp.EncodeToBytes(td) if err != nil { return err @@ -399,7 +426,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 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 @@ -414,7 +441,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 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 { @@ -434,12 +461,10 @@ func WriteBlockReceipts(db ethdb.Database, 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{ + entry := TxLookupEntry{ BlockHash: block.Hash(), BlockIndex: block.NumberU64(), Index: uint64(i), @@ -448,40 +473,49 @@ 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) - } return nil } +// WriteBloomBits writes the compressed bloom bits vector belonging to the given +// section and bit index. +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)) + 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) @@ -489,57 +523,15 @@ 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()...)) } -// 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) @@ -568,7 +560,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) @@ -576,13 +568,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 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 ethdb.Database, 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 { @@ -598,7 +590,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 @@ -613,7 +605,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 { diff --git a/core/database_util_test.go b/core/database_util_test.go index 7b23aab2a3..f1c2ac4249 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/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/core/types" - "github.com/ubiq/go-ubiq/crypto" "github.com/ubiq/go-ubiq/crypto/sha3" "github.com/ubiq/go-ubiq/ethdb" - "github.com/ubiq/go-ubiq/params" "github.com/ubiq/go-ubiq/rlp" ) @@ -340,7 +336,7 @@ func TestBlockReceiptStorage(t *testing.T) { db, _ := ethdb.NewMemDatabase() receipt1 := &types.Receipt{ - PostState: []byte{0x01}, + Status: types.ReceiptStatusFailed, CumulativeGasUsed: big.NewInt(1), Logs: []*types.Log{ {Address: common.BytesToAddress([]byte{0x11})}, @@ -351,7 +347,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})}, @@ -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, 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.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/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/gen_genesis.go b/core/gen_genesis.go index 831e3e4465..bf770f3f15 100644 --- a/core/gen_genesis.go +++ b/core/gen_genesis.go @@ -13,8 +13,6 @@ import ( "github.com/ubiq/go-ubiq/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 0cf6bad0fa..3221b2a4a0 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 } @@ -150,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.AllUbqhashProtocolChanges, common.Hash{}, errGenesisNoConfig } // Just commit the new block if there is no stored genesis block. @@ -215,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.AllUbqhashProtocolChanges } } @@ -284,7 +285,7 @@ func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) { } config := g.Config if config == nil { - config = params.AllProtocolChanges + config = params.AllUbqhashProtocolChanges } return block, WriteChainConfig(db, block.Hash(), config) } @@ -331,26 +332,30 @@ func DefaultTestnetGenesisBlock() *Genesis { } } -// DefaultRinkebyGenesisBlock returns the Rinkeby network genesis block. -func DefaultRinkebyGenesisBlock() *Genesis { - return &Genesis{ - Config: params.RinkebyChainConfig, - Timestamp: 1492009146, - ExtraData: hexutil.MustDecode("0x52657370656374206d7920617574686f7269746168207e452e436172746d616e42eb768f2244c8811c63729a21a3569731535f067ffc57839b00206d1ad20c69a1981b489f772031b279182d99e65703f0076e4812653aab85fca0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), - GasLimit: 4700000, - Difficulty: big.NewInt(1), - Alloc: decodePrealloc(rinkebyAllocData), - } -} +// DeveloperGenesisBlock returns the 'gubiq --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 -// DevGenesisBlock returns the 'gubiq --dev' genesis block. -func DevGenesisBlock() *Genesis { + // 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}): {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/genesis_alloc.go b/core/genesis_alloc.go index d04e0436e3..af0e615c02 100644 --- a/core/genesis_alloc.go +++ b/core/genesis_alloc.go @@ -22,5 +22,3 @@ package core const mainnetAllocData = "\xf9\a\x95\xe0\x94\x10N\xd5t\xbb\xa7\xef\v\xa8w\xd7(Za\x1fT\xb2Z\xd16\x8a6\fAo[\xb1\xee2\xc0\x00\xe0\x94\x17z\xa4\xf1\x9c\xfb\xb4\xdeS\x9c[\xb2\xf0c\x9c\xdf/\x11\xaf)\x8a\x8f\x92\a\"\xf1,\x16\xf8\xa0\x00\xe0\x94\x18k#\x88Q\x8d\xf7\u0230o\xb9\xd3\x1b\xe1=d(\x1b]\x00\x8a6\f0\x90\x91\xa6x\xc7\xe8\x00\xe0\x94\"\u02aek\a\xcdH\x9e1\u0676\xffu\xeb\x11\xd4\xcf\b\x12\x85\x8aN\x97j#\xf2\xc9\rQ\xa8\x00\xe0\x94#H\x96&`Cw\r\xbeI0\fY:\xf6\xfc\xcb\xcd\a\xb5\x8a6\f\x11.\x10\xbd\xba\xe4 \x00\xe0\x94/\x85n\xecX\x0eJ\xee=\xeeI*\xa2L\x875[-\x13\v\x8ai\xe3\xc3\xcb\x15\x8d\x82\b\x00\x00\xe0\x94/\xaa\xd4N\x88~\xfdA\xed!\x8e\x82\xff')\u0438\xaa\xbcP\x8a\r\x11\xc8_\x1b\xee\x80\xc7\xd0\x00\xe0\x94/\xb7\x02\xaa\t^l\xcfC\xa0\xbc;\x19\xacO\x84C\x9c\u0413\x8a67\xb60\xf7\x15j3`\x00\u07d41;\xf8\x8e\xdf|^\xc6+\xf9\n\xd8>\xa7\x03\xdb\xd5'C4\x89%\x1f+}\x16\a\xb88\x00\xe0\x942\xa9\xcd\xc9Y\x80\x85\x9fn\xad\xbf\x995\xdb\xf9\a'\xcf2|\x8aqW\v$\xf0.\xcb\xf60\x00\xe0\x94<[\xbaz\u0401\n\xde\u07b0\xbf\xab\xfa\xc39\x11\xac\u0228a\x8a6\f\v\xab\xa6\x87\x1bQX\x00\xe0\x94>T)\xd2\xc0\xd0FC\a\t\xf2\x00\x18g\xfc]\xae\xd5\xdcy\x8a6\f#\xbd\xb4\xb5\xc0\xe0\xf8\x00\xe0\x94D2\x9f\bb\xb3\xd0,\xe0\x1d\xa2\xc0\x1e\x1e\x01'{\x989;\x8a\x19\u07bd\xe7>M~\xcbP\x00\xe0\x94F\x83\t\x15\xfb\x04R{v_\xfcp\x19R\xa1q\x9eY/\v\x8aGE\x91\x12\xb3V\x83=\xc8\x00\u07d4J\x9en\v\x17x\xdaU\xb2\xec\xae\xdb\x19\"0\x87!\x80\xc1\xa9\x89\r\x8drkqw\xa8\x00\x00\xe0\x94U\x16UV\xfc;\x80\xd6y\xa0\xfd\u05e0,\x13\xe6\xa1n>\x04\x8a\xe1\x12\xba]\b\n\a^\x18\x00\u07d4Ul\x85w\x9b\x94'\x11\x12\x88\x90&\xe6\x82?\xb3\xa3\x97=B\x89n2\x82\x8d_\xe9\x990\x00\xe0\x94Y\xaf\n0\xa1\xca\xd7M\xb9z#\x1ex\xe9a\xec@\x17l\x00\x8au&\xf3\xae\xb3\xf2T\x9a\xe0\x00\xe0\x94Z\x87L\xa7\xb8.\x82I\x91\x92\xb6\x9d\xc2\x1a5\xa1\x94\x01\x9a2\x8a*\xf4\xdb\xdc\xf9bL\xa3\x18\x00\xe0\x94Z\xb8\x0f\xdb\xc7W\xf0]\f\f\xa37\xcaa\xdd\"\x133Qy\x8av\x1a\x11;7>\u075f\xd0\x00\xe1\x94ht\f8\u0516\x85\x976vp\xba\x89R\xe7RI\xff\u34cb\x10'\x1c\xaf\x19A\xf5_ \xa0\x00\xe0\x94n\xa8_\x97\x02\x06\x01\x06\u06ba!\xdd\xf1l\xaf!\x95\xc5,_\x8a6\fZ\x83-\x89\xa9\xb8\xd0\x00\xe0\x94s:\x16Y\xd8J@\x16}\xa0\xd4\x0f(\xf8m\xc0Y\u012d\xa8\x8a#|F\x9c\t\xf3\xf6$\xb0\x00\xe0\x94tn\x19&\xc0\xf65E\x99\xb9<\xdci\x1a[\x1f\xcf\xd82\xfb\x8a\x15-\u0534\xf4\xa4\xce?\x00\x00\u07d4wU\\\bU\xbd5\xdc\\ \xebOAK\x1aG*r\aw\x89\x0f_\xd4\xfb\xa0@:x\x00\xe0\x94|\xb1s\x93\xeb}\x12\nO\x9b\x1eE\x94b\xf3\u0780\x8f^\x01\x8aU\xe9\x8e%SJEsa\x05C\xf2\xeb\xfe#K\x92\xb9\x11\xb6\x8a\x81rWk\x19\x1c<\xdb8\x00\xe0\x94\x92\x97\xb75\x8e\xc6W\xfb\xe1\xa3\u0258\xe1\x16lk\xd8\u0384\xc1\x8a\x04p\aE\x19\x96\x86i@\x00\xe0\x94\x94&\xa5\x19\xee2\xd3j\x04\xe4\x90_u\xbc\x9f\x13x,\xc4\xff\x8ai\xe3\xc3\xcb\x15\x8d\x82\b\x00\x00\xe0\x94\x94\x81\xf3\xf9\x8a\f\xc4`\xc0\xd5\v\xbf3\xf7J\x89\u00d8ig\x8ai\xe3\xc3\u03a3\f&\u0380\x00\xe0\x94\x94\xfeBd\xa9`X\x95\xa6\xb7\t\f\xe1A\xdf}\xc1\fB\x17\x8a6\fD\xb9\xac\xb4\x10\xa3\xf0\x00\xe0\x94\x95\xdeY\xde>\xbd\u0671\xdaT\xcb\xe1\x1d\x8a\x99;Q\u007f\xa9E\x8a6\f5\xb6\x93\xd0\xc5H(\x00\xe0\x94\x97\xa9T\xfb\xbe\x821n\xa8\xec[E\xf9\xe8\xa1:\x85\u066fh\x8a6\f\x1c\x9f\x86\x83\xb7\xf1\b\x00\u07d4\x97\xaf\xf0\xf2L|p\x93Tj\x0e\xb4du\x010i\x90\x1cZ\x89\x1b7\xf5\xd9(\x9d[\xd0\x00\xe0\x94\x98\x06\xfa\x18\xf7G&*\xa4\xaa\a\x8e\x18\x8a5i(19G\x8a\x01\x00r\xe7\xeb\xa4/\xe7 \x00\xe0\x94\x9c-\xf3{X\xc5\x16\u01a1L\u007f\x1d\x8aA\xa6\xb5\xd5\xe9m\u04ca\xaav\x82\xfc\u016c;\x98\x00\x00\xe0\x94\x9d\x9c\xaa\x8eM\xe7\xfc\xc1$\b\xc0\xe8\x8a\xf7E\x9b\x1d\x9f\xb1\x83\x8a\x15zy\x16O\f\xe5{\xd8\x00\xe0\x94\xa3%\xd5\x1fp\x85\xc4^&\xfb=\x9d\x88\x12hd;\xe1/\u024a6\fY\x90\x00\xfdv\xec@\x00\xe0\x94\xa4\xcf\u007f`kk;\xbf\xefW\u00e9\x90\x1e\x97hZ\x8c\xdff\x8aD\x13\x17l\a\x01\x8f\xad\xd0\x00\xe0\x94\xaa\xb0\xc5\xffX\xd2\x01\x97F\xb5\x83V\xc6\x1b\x8bS\xe9M\xe6\u008a 7\x94r\xb0\b\xec:X\x00\u152ex#+\x8e\x80T\x92\xc0\xe3\x9e\xc0\xd4\xe9\x1f\x91\xf4~\xcc5\x8b\x01\x01\x81vZ\x82_\u079f\x00\x00\xe0\x94\xb0:H\x95\x9c0\xc1\xc3<\xce\x10_k\u007f \x81\xa2\xee\xa6\t\x8a7\xf7\xea\x00`\xa44\xed(\x00\xe0\x94\xb6\u0359{\x02N\x9e\xca\x13R\xa1d3]w\x1c%\xb4\x01\xf3\x8ai\xe3\xc3\u03a3\f&\u0380\x00\u07d4\xb9e\xf89\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 f10c29fbed..c239977483 100644 --- a/core/genesis_test.go +++ b/core/genesis_test.go @@ -26,7 +26,6 @@ import ( "github.com/ubiq/go-ubiq/consensus/ubqhash" "github.com/ubiq/go-ubiq/core/vm" "github.com/ubiq/go-ubiq/ethdb" - "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/params" ) @@ -66,7 +65,7 @@ func TestSetupGenesis(t *testing.T) { return SetupGenesisBlock(db, new(Genesis)) }, wantErr: errGenesisNoConfig, - wantConfig: params.AllProtocolChanges, + wantConfig: params.AllUbqhashProtocolChanges, }, { name: "no block in DB, genesis == nil", @@ -119,7 +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, ubqhash.NewFullFaker(), new(event.TypeMux), vm.Config{}) + bc, _ := NewBlockChain(db, oldcustomg.Config, ubqhash.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/headerchain.go b/core/headerchain.go index 5fa5f02f68..78ab09cd95 100644 --- a/core/headerchain.go +++ b/core/headerchain.go @@ -275,7 +275,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 } @@ -431,10 +431,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/journal.go b/core/state/journal.go index 8885412208..580cb9e2b7 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) - } } } @@ -137,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) { diff --git a/core/state/statedb.go b/core/state/statedb.go index 088344ae65..17e938d4ae 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/sync.go b/core/state/sync.go index a3310636a1..358e954856 100644 --- a/core/state/sync.go +++ b/core/state/sync.go @@ -18,60 +18,24 @@ package state import ( "bytes" - "math/big" "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/rlp" "github.com/ubiq/go-ubiq/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/core/state_processor.go b/core/state_processor.go index 0ee5f7d3a7..9a64d79e97 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -98,17 +98,23 @@ 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 } // Update the state with pending changes + var root []byte + if config.IsByzantium(header.Number) { + statedb.Finalise(true) + } 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, 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 f5766a8b9a..3ccc1038a9 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -18,7 +18,6 @@ package core import ( "errors" - "fmt" "math/big" "github.com/ubiq/go-ubiq/common" @@ -59,8 +58,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 +125,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 { @@ -198,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() @@ -208,7 +209,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 +223,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 +249,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 +257,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/tx_journal.go b/core/tx_journal.go new file mode 100644 index 0000000000..c0428cb00f --- /dev/null +++ b/core/tx_journal.go @@ -0,0 +1,163 @@ +// 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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/core/types" + "github.com/ubiq/go-ubiq/log" + "github.com/ubiq/go-ubiq/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") + +// 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 { + 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() + + // Temporarily 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 + + 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_list.go b/core/tx_list.go index 5f9918a938..370782f6b2 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 } } @@ -298,6 +301,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 { @@ -435,6 +439,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.go b/core/tx_pool.go index 47cdc49c48..a936c384ff 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" @@ -34,6 +35,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,11 +103,31 @@ var ( underpricedTxCounter = metrics.NewCounter("txpool/underpriced") ) -type stateFn func() (*state.StateDB, error) +// 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 { + 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. 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 +143,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 +161,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 @@ -151,96 +186,116 @@ 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 - pendingState *state.ManagedState - gasLimit func() *big.Int // The current gas limit function callback + chain blockChain gasPrice *big.Int - eventMux *event.TypeMux - events *event.TypeMuxSubscription - locals *accountSet + txFeed event.Feed + scope event.SubscriptionScope + chainHeadCh chan ChainHeadEvent + chainHeadSub 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 + 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 } // 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, 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, - 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, - gasPrice: new(big.Int).SetUint64(config.PriceLimit), - pendingState: nil, - events: eventMux.Subscribe(ChainHeadEvent{}, RemovedTransactionEvent{}), - quit: make(chan struct{}), + 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.resetState() + pool.reset(nil, chain.CurrentBlock().Header()) - // 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) + } + } + // Subscribe events from blockchain + pool.chainHeadSub = pool.chain.SubscribeChainHeadEvent(pool.chainHeadCh) + + // 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() + + // Track the previous head headers for transaction reorgs + head := pool.chain.CurrentBlock() + + // 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: + // Handle ChainHeadEvent + case ev := <-pool.chainHeadCh: + if ev.Block != nil { pool.mu.Lock() - if ev.Block != nil { - if pool.chainconfig.IsHomestead(ev.Block.Number()) { - pool.homestead = true - } + if pool.chainconfig.IsHomestead(ev.Block.Number()) { + pool.homestead = true } - pool.resetState() - pool.mu.Unlock() + pool.reset(head.Header(), ev.Block.Header()) + head = ev.Block - case RemovedTransactionEvent: - pool.addTxs(ev.Txs, false) + pool.mu.Unlock() } + // Be unsubscribed due to system stopped + case <-pool.chainHeadSub.Err(): + return // Handle stats reporting ticks case <-report.C: @@ -253,23 +308,118 @@ 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 { + 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() { - currentState, err := pool.currentState() +// 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(oldHead, newHead *types.Header) { + pool.mu.Lock() + defer pool.mu.Unlock() + + 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(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 { + // If the reorg is too deep, avoid doing it (will happen during fast sync) + oldNum := oldHead.Number.Uint64() + newNum := newHead.Number.Uint64() + + 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) + } + } + // Initialize the internal state to the current head + if newHead == nil { + newHead = pool.chain.CurrentBlock().Header() // 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 { @@ -278,18 +428,30 @@ func (pool *TxPool) resetState() { } // 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() { - pool.events.Unsubscribe() - close(pool.quit) + // Unsubscribe all subscriptions registered from txpool + pool.scope.Close() + + // Unsubscribe subscriptions registered from blockchain + pool.chainHeadSub.Unsubscribe() pool.wg.Wait() + if pool.journal != nil { + pool.journal.close() + } 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() @@ -345,8 +507,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 { @@ -373,6 +535,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 { @@ -386,7 +564,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.currentMaxGas.Cmp(tx.Gas()) < 0 { return ErrGasLimit } // Make sure the transaction is signed properly @@ -400,16 +578,12 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error { return ErrUnderpriced } // Ensure the transaction adheres to nonce ordering - currentState, err := pool.currentState() - 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) @@ -473,18 +647,26 @@ 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()) + + // 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 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 +697,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! @@ -549,7 +743,8 @@ 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 @@ -569,14 +764,14 @@ 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 { +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 { +func (pool *TxPool) AddRemotes(txs []*types.Transaction) []error { return pool.addTxs(txs, false) } @@ -592,25 +787,30 @@ 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() - 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 } // 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() + 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 { - if replace, err := pool.add(tx, local); err == nil { + errs := make([]error, len(txs)) + + for i, tx := range txs { + var replace bool + if replace, errs[i] = pool.add(tx, local); errs[i] == nil { if !replace { from, _ := types.Sender(pool.signer, tx) // already validated dirty[from] = struct{}{} @@ -619,17 +819,33 @@ 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() - if err != nil { - return err - } addrs := make([]common.Address, 0, len(dirty)) - for addr, _ := range dirty { + for addr := range dirty { addrs = append(addrs, addr) } - pool.promoteExecutables(state, addrs) + pool.promoteExecutables(addrs) } - return nil + return errs +} + +// 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() + + 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] = TxStatusQueued + } + } + } + return status } // Get returns a transaction if it is contained in the pool @@ -641,24 +857,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) { @@ -705,13 +903,11 @@ 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.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)) - for addr, _ := range pool.queue { + for addr := range pool.queue { accounts = append(accounts, addr) } } @@ -722,14 +918,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) @@ -874,12 +1070,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.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) { @@ -889,7 +1083,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) @@ -902,6 +1096,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) @@ -910,39 +1112,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 +1124,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 5fc8423a66..ce43fa5c3b 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,39 @@ import ( "github.com/ubiq/go-ubiq/params" ) +// testTxPoolConfig is a transaction pool configuration without stateful disk +// sideeffects used during testing. +var testTxPoolConfig TxPoolConfig + +func init() { + testTxPoolConfig = DefaultTxPoolConfig + testTxPoolConfig.Journal = "" +} + +type testBlockChain struct { + statedb *state.StateDB + gasLimit *big.Int + chainHeadFeed *event.Feed +} + +func (bc *testBlockChain) CurrentBlock() *types.Block { + return types.NewBlock(&types.Header{ + GasLimit: bc.gasLimit, + }, nil, nil, nil) +} + +func (bc *testBlockChain) GetBlock(hash common.Hash, number uint64) *types.Block { + 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) } @@ -45,10 +80,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)} 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, blockchain) return pool, key } @@ -70,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 } @@ -82,52 +117,80 @@ 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) } +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(). -func TestStateChangeDuringPoolReset(t *testing.T) { +func TestStateChangeDuringTransactionPoolReset(t *testing.T) { + t.Parallel() + var ( 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)}, 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(DefaultTxPoolConfig, params.TestChainConfig, mux, stateFunc, gasLimitFunc) + pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) defer pool.Stop() - pool.resetState() nonce := pool.State().GetNonce(address) if nonce != 0 { @@ -144,7 +207,7 @@ func TestStateChangeDuringPoolReset(t *testing.T) { // trigger state change in the background trigger = true - pool.resetState() + pool.lockedReset(nil, nil) pendingTx, err := pool.Pending() if err != nil { @@ -162,25 +225,27 @@ func TestStateChangeDuringPoolReset(t *testing.T) { } func TestInvalidTransactions(t *testing.T) { + t.Parallel() + pool, key := setupTxPool() defer pool.Stop() tx := transaction(0, big.NewInt(100), key) from, _ := deriveSender(tx) - currentState, _ := pool.currentState() - 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) @@ -197,26 +262,27 @@ func TestInvalidTransactions(t *testing.T) { } func TestTransactionQueue(t *testing.T) { + t.Parallel() + pool, key := setupTxPool() defer pool.Stop() tx := transaction(0, big.NewInt(100), key) from, _ := deriveSender(tx) - currentState, _ := pool.currentState() - currentState.AddBalance(from, big.NewInt(1000)) - pool.resetState() + 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") } @@ -226,19 +292,20 @@ 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) from, _ = deriveSender(tx1) - currentState, _ = pool.currentState() - currentState.AddBalance(from, big.NewInt(1000)) - pool.resetState() + 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)) @@ -248,51 +315,23 @@ func TestTransactionQueue(t *testing.T) { } } -func TestRemoveTx(t *testing.T) { - pool, key := setupTxPool() - defer pool.Stop() +func TestTransactionNegativeValue(t *testing.T) { + t.Parallel() - addr := crypto.PubkeyToAddress(key.PublicKey) - currentState, _ := pool.currentState() - 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.currentState() - 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) } } func TestTransactionChainFork(t *testing.T) { + t.Parallel() + pool, key := setupTxPool() defer pool.Stop() @@ -300,10 +339,10 @@ 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() - currentState.AddBalance(addr, big.NewInt(100000000000000)) - pool.resetState() + statedb.AddBalance(addr, big.NewInt(100000000000000)) + + pool.chain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} + pool.lockedReset(nil, nil) } resetState() @@ -311,7 +350,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() @@ -321,6 +360,8 @@ func TestTransactionChainFork(t *testing.T) { } func TestTransactionDoubleNonce(t *testing.T) { + t.Parallel() + pool, key := setupTxPool() defer pool.Stop() @@ -328,10 +369,10 @@ 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() - currentState.AddBalance(addr, big.NewInt(100000000000000)) - pool.resetState() + statedb.AddBalance(addr, big.NewInt(100000000000000)) + + pool.chain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} + pool.lockedReset(nil, nil) } resetState() @@ -347,8 +388,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() - 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()) } @@ -357,7 +397,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()) } @@ -370,13 +410,14 @@ func TestTransactionDoubleNonce(t *testing.T) { } } -func TestMissingNonce(t *testing.T) { +func TestTransactionMissingNonce(t *testing.T) { + t.Parallel() + pool, key := setupTxPool() defer pool.Stop() addr := crypto.PubkeyToAddress(key.PublicKey) - currentState, _ := pool.currentState() - 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) @@ -392,58 +433,41 @@ func TestMissingNonce(t *testing.T) { } } -func TestNonceRecovery(t *testing.T) { +func TestTransactionNonceRecovery(t *testing.T) { + t.Parallel() + const n = 10 pool, key := setupTxPool() defer pool.Stop() addr := crypto.PubkeyToAddress(key.PublicKey) - currentState, _ := pool.currentState() - currentState.SetNonce(addr, n) - currentState.AddBalance(addr, big.NewInt(100000000000000)) - pool.resetState() + 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.resetState() - 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.currentState() - currentState.AddBalance(from, big.NewInt(1000000000000)) - pool.resetState() - pool.eventMux.Post(RemovedTransactionEvent{types.Transactions{tx}}) - pool.eventMux.Post(ChainHeadEvent{nil}) - 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) } } // 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() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - - state, _ := pool.currentState() - state.AddBalance(account, big.NewInt(1000)) + pool.currentState.AddBalance(account, big.NewInt(1000)) // Add some pending and some queued transactions var ( @@ -471,7 +495,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(nil, nil) if pool.pending[account].Len() != 3 { t.Errorf("pending transaction mismatch: have %d, want %d", pool.pending[account].Len(), 3) } @@ -482,8 +506,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.resetState() + 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) @@ -507,8 +531,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.gasLimit = func() *big.Int { return big.NewInt(100) } - pool.resetState() + 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) @@ -531,14 +555,14 @@ 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() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - - state, _ := pool.currentState() - state.AddBalance(account, big.NewInt(1000)) + pool.currentState.AddBalance(account, big.NewInt(1000)) // Add a batch consecutive pending transactions for validation txns := []*types.Transaction{} @@ -562,7 +586,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(nil, nil) if pool.pending[account].Len() != len(txns) { t.Errorf("pending transaction mismatch: have %d, want %d", pool.pending[account].Len(), len(txns)) } @@ -573,8 +597,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.resetState() + 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]) @@ -604,39 +628,95 @@ func TestTransactionPostponing(t *testing.T) { } } -// 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) { +// 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)) - state, _ := pool.currentState() - state.AddBalance(account, big.NewInt(1000000)) - pool.resetState() + // 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() + + account, _ := deriveSender(transaction(0, big.NewInt(0), key)) + 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 <= 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) } } @@ -653,25 +733,25 @@ 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)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} - 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) }) + pool := NewTxPool(config, params.TestChainConfig, blockchain) defer pool.Stop() - pool.resetState() // Create a number of test accounts and fund them (last one will be the local) - state, _ := pool.currentState() - 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] @@ -742,27 +822,26 @@ 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)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} - config := DefaultTxPoolConfig - config.Lifetime = 250 * time.Millisecond + 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() - pool.resetState() // Create two test accounts to ensure remotes expire but locals do not local, _ := crypto.GenerateKey() remote, _ := crypto.GenerateKey() - state, _ := pool.currentState() - 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 { @@ -771,7 +850,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) } @@ -784,7 +863,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) } @@ -806,18 +885,22 @@ 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() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) + pool.currentState.AddBalance(account, big.NewInt(1000000)) - state, _ := pool.currentState() - state.AddBalance(account, big.NewInt(1000000)) - pool.resetState() + // 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 < 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 +911,14 @@ 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) + } + 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) } } @@ -839,25 +928,29 @@ 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() - account1, _ := deriveSender(transaction(0, big.NewInt(0), key1)) - state1, _ := pool1.currentState() - state1.AddBalance(account1, big.NewInt(1000000)) + defer pool1.Stop() - for i := uint64(0); i < DefaultTxPoolConfig.AccountQueue+5; i++ { + account1, _ := deriveSender(transaction(0, big.NewInt(0), key1)) + 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 { t.Fatalf("tx %d: failed to add transaction: %v", i, err) } } // 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)) + pool2.currentState.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) @@ -884,24 +977,24 @@ 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)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} - 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) }) + pool := NewTxPool(config, params.TestChainConfig, blockchain) defer pool.Stop() - pool.resetState() // Create a number of test accounts and fund them - state, _ := pool.currentState() - 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) @@ -929,27 +1022,27 @@ 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) { + t.Parallel() + // 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)} - 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) }) + pool := NewTxPool(config, params.TestChainConfig, blockchain) defer pool.Stop() - pool.resetState() // Create a number of test accounts and fund them - state, _ := pool.currentState() - 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++ { @@ -966,24 +1059,24 @@ 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)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} - 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) }) + pool := NewTxPool(config, params.TestChainConfig, blockchain) defer pool.Stop() - pool.resetState() // Create a number of test accounts and fund them - state, _ := pool.currentState() - 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) @@ -1015,21 +1108,26 @@ 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)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} - 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, blockchain) defer pool.Stop() - pool.resetState() + + // 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 - state, _ := pool.currentState() - 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{} @@ -1048,26 +1146,32 @@ 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) } 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) } // 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) } 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) } @@ -1078,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) } @@ -1086,39 +1193,107 @@ 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 := 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) } } +// 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)) + 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 + keys := make([]*ecdsa.PrivateKey, 3) + for i := 0; i < len(keys); i++ { + keys[i], _ = crypto.GenerateKey() + 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++ { + // 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. // // 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)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} - 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) }) + pool := NewTxPool(config, params.TestChainConfig, blockchain) defer pool.Stop() - pool.resetState() + + // 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 - state, _ := pool.currentState() - 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{} @@ -1134,13 +1309,16 @@ 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) } 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) } @@ -1158,13 +1336,16 @@ 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) } 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) } @@ -1173,13 +1354,16 @@ 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) } 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) } @@ -1188,23 +1372,28 @@ 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)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} - 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, blockchain) defer pool.Stop() - pool.resetState() + + // 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() - - state, _ := pool.currentState() - 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) - 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) @@ -1215,41 +1404,165 @@ 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) } - 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 { + 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) + 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 { + t.Fatalf("queued replacement event firing failed: %v", err) } if err := validateTxPoolInternals(pool); err != nil { t.Fatalf("pool internal state corrupted: %v", err) } } +// 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) { + t.Parallel() + + // 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)) + blockchain := &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} + + config := testTxPoolConfig + config.NoLocals = nolocals + config.Journal = journal + config.Rejournal = time.Second + + pool := NewTxPool(config, params.TestChainConfig, blockchain) + + // Create two test accounts to ensure remotes expire but locals do not + local, _ := crypto.GenerateKey() + remote, _ := crypto.GenerateKey() + + 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 { + 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) + blockchain = &testBlockChain{statedb, big.NewInt(1000000), new(event.Feed)} + + pool = NewTxPool(config, params.TestChainConfig, blockchain) + + 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.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) + + 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) + } + pool.Stop() +} + // Benchmarks the speed of validating the contents of the pending queue of the // transaction pool. func BenchmarkPendingDemotion100(b *testing.B) { benchmarkPendingDemotion(b, 100) } @@ -1262,8 +1575,7 @@ func benchmarkPendingDemotion(b *testing.B, size int) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.currentState() - 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) @@ -1272,7 +1584,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() } } @@ -1288,8 +1600,7 @@ func benchmarkFuturePromotion(b *testing.B, size int) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.currentState() - 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) @@ -1298,7 +1609,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) } } @@ -1309,8 +1620,7 @@ func BenchmarkPoolInsert(b *testing.B) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.currentState() - 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++ { @@ -1334,8 +1644,7 @@ func benchmarkPoolBatchInsert(b *testing.B, size int) { defer pool.Stop() account, _ := deriveSender(transaction(0, big.NewInt(0), key)) - state, _ := pool.currentState() - 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/core/types/bloom9.go b/core/types/bloom9.go index 30bde53610..8284f1f84c 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. diff --git a/core/types/gen_receipt_json.go b/core/types/gen_receipt_json.go index 47fb1df957..655862ffc4 100644 --- a/core/types/gen_receipt_json.go +++ b/core/types/gen_receipt_json.go @@ -13,7 +13,8 @@ import ( func (r Receipt) MarshalJSON() ([]byte, error) { type Receipt struct { - PostState hexutil.Bytes `json:"root" gencodec:"required"` + PostState hexutil.Bytes `json:"root"` + Status hexutil.Uint `json:"status"` 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.Status = hexutil.Uint(r.Status) enc.CumulativeGasUsed = (*hexutil.Big)(r.CumulativeGasUsed) enc.Bloom = r.Bloom enc.Logs = r.Logs @@ -34,7 +36,8 @@ 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"` + Status *hexutil.Uint `json:"status"` CumulativeGasUsed *hexutil.Big `json:"cumulativeGasUsed" gencodec:"required"` Bloom *Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` @@ -46,10 +49,12 @@ 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 + } + if dec.Status != nil { + r.Status = uint(*dec.Status) } - 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 c20adf9b09..088e9f8716 100644 --- a/core/types/receipt.go +++ b/core/types/receipt.go @@ -17,6 +17,7 @@ package types import ( + "bytes" "fmt" "io" "math/big" @@ -28,10 +29,24 @@ import ( //go:generate gencodec -type Receipt -field-override receiptMarshaling -out gen_receipt_json.go +var ( + 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" gencodec:"required"` + PostState []byte `json:"root"` + Status uint `json:"status"` CumulativeGasUsed *big.Int `json:"cumulativeGasUsed" gencodec:"required"` Bloom Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` @@ -44,39 +59,89 @@ type Receipt struct { type receiptMarshaling struct { PostState hexutil.Bytes + Status hexutil.Uint CumulativeGasUsed *hexutil.Big GasUsed *hexutil.Big } +// receiptRLP is the consensus encoding of a receipt. +type receiptRLP struct { + PostStateOrStatus []byte + CumulativeGasUsed *big.Int + Bloom Bloom + Logs []*Log +} + +type receiptStorageRLP struct { + PostStateOrStatus []byte + CumulativeGasUsed *big.Int + Bloom Bloom + TxHash common.Hash + ContractAddress common.Address + Logs []*LogForStorage + GasUsed *big.Int +} + // 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 { + 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 -// into an RLP stream. +// 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, []interface{}{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 { - var receipt struct { - PostState []byte - CumulativeGasUsed *big.Int - Bloom Bloom - Logs []*Log - } - if err := s.Decode(&receipt); err != nil { + var dec receiptRLP + if err := s.Decode(&dec); err != nil { return err } - r.PostState, r.CumulativeGasUsed, r.Bloom, r.Logs = receipt.PostState, receipt.CumulativeGasUsed, receipt.Bloom, receipt.Logs + if err := r.setStatus(dec.PostStateOrStatus); err != nil { + return err + } + r.CumulativeGasUsed, r.Bloom, r.Logs = dec.CumulativeGasUsed, dec.Bloom, dec.Logs return nil } +func (r *Receipt) setStatus(postStateOrStatus []byte) error { + switch { + 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: + return fmt.Errorf("invalid receipt status %x", postStateOrStatus) + } + return nil +} + +func (r *Receipt) statusEncoding() []byte { + if len(r.PostState) == 0 { + if r.Status == ReceiptStatusFailed { + return receiptStatusFailedRLP + } + return receiptStatusSuccessfulRLP + } + return r.PostState +} + // String implements the Stringer interface. func (r *Receipt) String() string { + 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) } @@ -87,37 +152,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.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 - 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.CumulativeGasUsed, r.Bloom = receipt.PostState, 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 } diff --git a/core/types/transaction.go b/core/types/transaction.go index ac469b0f7e..81d4f7fd5f 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. @@ -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, @@ -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_signing.go b/core/types/transaction_signing.go index 0d8f499c17..854fa31181 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 ea88985341..324e714f47 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()) } } @@ -143,15 +144,15 @@ func TestTransactionPriceNonceSort(t *testing.T) { } } // Sort the transactions and cross check the nonce ordering - txset := NewTransactionsByPriceAndNonce(groups) + 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) diff --git a/core/vm/analysis.go b/core/vm/analysis.go index f2e6530af1..94363ad1ec 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 { @@ -38,24 +38,53 @@ 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 (m[udest/8] & (1 << (udest % 8))) != 0 + return OpCode(code[udest]) == JUMPDEST && m.codeSegment(udest) } -// 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++ { +// 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) { + (*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)) +} + +// 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 +} + +// 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) + 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.set8(pc) // 8 + pc += 8 + } + for ; numbits > 0; numbits-- { + bits.set(pc) + pc++ + } + } else { + pc++ } } - return m + return bits } diff --git a/core/vm/analysis_test.go b/core/vm/analysis_test.go new file mode 100644 index 0000000000..a64f90ed9c --- /dev/null +++ b/core/vm/analysis_test.go @@ -0,0 +1,53 @@ +// 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" + +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 := codeBitmap(test.code) + if ret[test.which] != test.exp { + t.Fatalf("expected %x, got %02x", test.exp, ret[test.which]) + } + } + +} diff --git a/core/vm/common.go b/core/vm/common.go index 172bd13c69..ca555f3470 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 95d0f46fe0..20c371dd4e 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go @@ -22,15 +22,14 @@ import ( "math/big" "github.com/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/common/math" "github.com/ubiq/go-ubiq/crypto" - "github.com/ubiq/go-ubiq/log" + "github.com/ubiq/go-ubiq/crypto/bn256" "github.com/ubiq/go-ubiq/params" "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 { @@ -38,52 +37,63 @@ 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{}, } -// RunPrecompile runs and evaluate the output of a precompiled contract defined in contracts.go +// 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{}, + common.BytesToAddress([]byte{4}): &dataCopy{}, + common.BytesToAddress([]byte{5}): &bigModExp{}, + common.BytesToAddress([]byte{6}): &bn256Add{}, + common.BytesToAddress([]byte{7}): &bn256ScalarMul{}, + common.BytesToAddress([]byte{8}): &bn256Pairing{}, +} + +// 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) { - log.Trace("ECRECOVER error: v, r or s value invalid") + // 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 { - log.Trace("ECRECOVER failed", "err", err) return nil, nil } @@ -91,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. @@ -99,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. @@ -114,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. @@ -130,8 +140,240 @@ 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{} + +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 { + var ( + 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)) + ) + 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 { + if expLen.Cmp(big32) > 0 { + expHead = new(big.Int).SetBytes(getData(input, baseLen.Uint64(), 32)) + } else { + expHead = new(big.Int).SetBytes(getData(input, baseLen.Uint64(), 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(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(big64) <= 0: + gas.Mul(gas, gas) + case gas.Cmp(big1024) <= 0: + gas = new(big.Int).Add( + 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), big16), + new(big.Int).Sub(new(big.Int).Mul(big480, gas), big199680), + ) + } + gas.Mul(gas, math.BigMax(adjExpLen, big1)) + 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) { + var ( + 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() + ) + 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(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 + return common.LeftPadBytes([]byte{}, int(modLen)), nil + } + return common.LeftPadBytes(base.Exp(base, exp, mod).Bytes(), int(modLen)), nil +} + +var ( + // 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") +) + +// 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 + } + gx, gy, _, _ := p.CurvePoints() + if gx.Cmp(bn256.P) >= 0 || gy.Cmp(bn256.P) >= 0 { + return nil, errInvalidCurvePoint + } + 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) { + x, err := newCurvePoint(getData(input, 0, 64)) + if err != nil { + return nil, err + } + y, err := newCurvePoint(getData(input, 64, 64)) + if err != nil { + return nil, err + } + res := new(bn256.G1) + res.Add(x, y) + return res.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) { + p, err := newCurvePoint(getData(input, 0, 64)) + if err != nil { + return nil, err + } + res := new(bn256.G1) + res.ScalarMult(p, new(big.Int).SetBytes(getData(input, 64, 32))) + return res.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 + 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 830a8f69d9..45a8621298 100644 --- a/core/vm/contracts_test.go +++ b/core/vm/contracts_test.go @@ -1 +1,467 @@ package vm + +import ( + "fmt" + "math/big" + "testing" + + "github.com/ubiq/go-ubiq/common" +) + +// precompiledTest defines the input/output pairs for precompiled contract tests. +type precompiledTest struct { + input, expected string + gas uint64 + name string + noBenchmark bool // Benchmark primarily the worst-cases +} + +// 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", + }, { + 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 +// multipication precompiled contract. +var bn256ScalarMulTests = []precompiledTest{ + { + input: "2bd3e6d0f3b142924f5ca7b49ce5b9d54c4703d7ae5648e61d02268b1a0a9fb721611ce0a6af85915e2f1d70300909ce2e49dfad4a4619c8390cae66cefdb20400000000000000000000000000000000000000000000000011138ce750fa15c2", + expected: "070a8d6a982153cae4be29d434e8faef8a47b274a053f5a4ee2a6c9c13c31e5c031b8ce914eba3a9ffb989f9cdd5b0f01943074bf4f0f315690ec3cec6981afc", + name: "chfast1", + }, { + input: "070a8d6a982153cae4be29d434e8faef8a47b274a053f5a4ee2a6c9c13c31e5c031b8ce914eba3a9ffb989f9cdd5b0f01943074bf4f0f315690ec3cec6981afc30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd46", + expected: "025a6f4181d2b4ea8b724290ffb40156eb0adb514c688556eb79cdea0752c2bb2eff3f31dea215f1eb86023a133a996eb6300b44da664d64251d05381bb8a02e", + name: "chfast2", + }, { + input: "025a6f4181d2b4ea8b724290ffb40156eb0adb514c688556eb79cdea0752c2bb2eff3f31dea215f1eb86023a133a996eb6300b44da664d64251d05381bb8a02e183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea3", + expected: "14789d0d4a730b354403b5fac948113739e276c23e0258d8596ee72f9cd9d3230af18a63153e0ec25ff9f2951dd3fa90ed0197bfef6e2a1a62b5095b9d2b4a27", + name: "chfast3", + }, { + input: "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + expected: "2cde5879ba6f13c0b5aa4ef627f159a3347df9722efce88a9afbb20b763b4c411aa7e43076f6aee272755a7f9b84832e71559ba0d2e0b17d5f9f01755e5b0d11", + 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", + 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", + 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, + }, +} + +// 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 := PrecompiledContractsByzantium[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) { + if test.noBenchmark { + return + } + p := PrecompiledContractsByzantium[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) { + for _, test := range modexpTests { + testPrecompiled("05", test, t) + } +} + +// 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) { + for _, test := range bn256AddTests { + testPrecompiled("06", test, t) + } +} + +// 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) { + for _, test := range bn256ScalarMulTests { + testPrecompiled("07", test, t) + } +} + +// 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) { + for _, test := range bn256PairingTests { + testPrecompiled("08", test, t) + } +} + +// Behcnmarks the sample inputs from the elliptic curve pairing check EIP 197. +func BenchmarkPrecompiledBn256Pairing(bench *testing.B) { + for _, test := range bn256PairingTests { + benchmarkPrecompiled("08", test, bench) + } +} 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 2bb4d9a826..7e61a98271 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -25,6 +25,10 @@ import ( "github.com/ubiq/go-ubiq/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) @@ -36,12 +40,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 - if p := precompiledContracts[*contract.CodeAddr]; p != nil { + precompiles := PrecompiledContractsHomestead + if evm.ChainConfig().IsByzantium(evm.BlockNumber) { + precompiles = PrecompiledContractsByzantium + } + if p := precompiles[*contract.CodeAddr]; p != nil { return RunPrecompiledContract(p, input, contract) } } - return evm.interpreter.Run(snapshot, contract, input) } @@ -100,8 +106,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, @@ -121,19 +127,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 } @@ -143,16 +150,19 @@ 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().IsByzantium(evm.BlockNumber) { + precompiles = PrecompiledContractsByzantium + } + 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) // 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)) @@ -162,27 +172,31 @@ 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 } -// 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 } @@ -199,25 +213,24 @@ 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 } -// 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 } @@ -227,24 +240,65 @@ 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)) 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 +} + +// 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 + } + // 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 + // 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() + ) + // 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)) + + // 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. + ret, err = run(evm, snapshot, contract, input) + if err != nil { + evm.StateDB.RevertToSnapshot(snapshot) + if err != errExecutionReverted { + contract.UseGas(contract.Gas) + } + } 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 { - return nil, common.Address{}, gas, nil - } // Depth check execution. Fail if we're trying to execute above the // limit. @@ -254,13 +308,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) @@ -273,9 +331,12 @@ 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 := 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 @@ -292,18 +353,16 @@ 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 + // 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/gas_table.go b/core/vm/gas_table.go index c241c27964..1c2720b70e 100644 --- a/core/vm/gas_table.go +++ b/core/vm/gas_table.go @@ -65,7 +65,33 @@ 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 + } + + 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 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 @@ -298,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) { @@ -370,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: @@ -423,6 +453,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 68cafaa9af..373defb59c 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,11 @@ import ( ) var ( - bigZero = new(big.Int) + 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") + errMaxCodeSizeExceeded = errors.New("evm: max code size exceeded") ) func opAdd(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { @@ -240,6 +245,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)) @@ -247,6 +253,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)) @@ -266,6 +273,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 { @@ -279,6 +287,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 { @@ -336,25 +345,47 @@ 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) { - stack.push(new(big.Int).SetBytes(getData(contract.Input, stack.pop(), common.Big32))) +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(), getData(contract.Input, cOff, l)) + memory.Set(memOffset.Uint64(), length.Uint64(), getDataBig(contract.Input, dataOffset, length)) + + evm.interpreter.intPool.put(memOffset, dataOffset, length) + 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 ( + memOffset = stack.pop() + dataOffset = stack.pop() + length = stack.pop() + ) + defer evm.interpreter.intPool.put(memOffset, dataOffset, length) + + end := new(big.Int).Add(dataOffset, length) + if end.BitLen() > 64 || uint64(len(evm.interpreter.returnData)) < end.Uint64() { + return nil, errReturnDataOutOfBounds + } + memory.Set(memOffset.Uint64(), length.Uint64(), evm.interpreter.returnData[dataOffset.Uint64():end.Uint64()]) - evm.interpreter.intPool.put(mOff, cOff, l) return nil, nil } @@ -376,31 +407,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 := getData(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 := getData(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 } @@ -505,6 +533,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 { @@ -520,6 +549,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 } @@ -551,7 +581,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 @@ -564,9 +594,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 } @@ -588,13 +620,13 @@ 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)) } else { stack.push(big.NewInt(1)) - + } + if err == nil || err == errExecutionReverted { memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) } contract.Gas += returnGas @@ -625,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 @@ -648,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 @@ -656,12 +690,49 @@ 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)) + } + if err == nil || err == errExecutionReverted { + 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()) 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 } @@ -674,7 +745,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/instructions_test.go b/core/vm/instructions_test.go index 1a90252e7b..bf0179f4f3 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,197 +63,169 @@ 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 := PrecompiledContracts[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 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) +} + func BenchmarkOpMul(b *testing.B) { x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" 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) - } + 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,22 +234,12 @@ 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) { -// x := "0" -// y := "32" -// -// opBenchmark(b,opSha3, x, y) -// -// -//} diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index ff03b78b84..4293e3cf4e 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -19,12 +19,10 @@ package vm import ( "fmt" "sync/atomic" - "time" "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/common/math" "github.com/ubiq/go-ubiq/crypto" - "github.com/ubiq/go-ubiq/log" "github.com/ubiq/go-ubiq/params" ) @@ -46,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 } @@ -61,7 +59,8 @@ type Interpreter struct { gasTable params.GasTable intPool *intPool - readonly bool + 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. @@ -71,6 +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().IsByzantium(evm.BlockNumber): + cfg.JumpTable = byzantiumInstructionSet case evm.ChainConfig().IsHomestead(evm.BlockNumber): cfg.JumpTable = homesteadInstructionSet default: @@ -87,6 +88,18 @@ func NewInterpreter(evm *EVM, cfg Config) *Interpreter { } func (in *Interpreter) enforceRestrictions(op OpCode, operation operation, stack *Stack) error { + 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 + // 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) { + return errWriteProtection + } + } + } return nil } @@ -97,9 +110,14 @@ 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-- }() + // 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 @@ -119,22 +137,20 @@ 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 - // 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) + if err != nil && !logged && in.cfg.Debug { + in.cfg.Tracer.CaptureState(in.evm, pcCopy, op, gasCopy, cost, mem, stackCopy, 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 @@ -143,22 +159,29 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret // Get the memory location of pc op = contract.GetOp(pc) - // get the operation from the jump table matching the opcode - operation := in.cfg.JumpTable[op] - if err := in.enforceRestrictions(op, operation, stack); err != nil { - return nil, err + if in.cfg.Debug { + logged = false + pcCopy = pc + gasCopy = contract.Gas + stackCopy = newstack() + for _, val := range stack.data { + stackCopy.push(val) + } } - // if the op is invalid abort the process and return an error + // 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 !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 @@ -188,10 +211,9 @@ 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 } - // 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) @@ -200,20 +222,22 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret if verifyPool { verifyIntegerPool(in.intPool) } + // 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++ } - // if the operation returned a value make sure that is also set - // the last return data. - if res != nil { - mem.lastReturn = ret - } } return nil, nil } diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index c9d50bd965..126c9d3d5f 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -41,25 +41,59 @@ 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 + + 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 operations sets the return data content } var ( frontierInstructionSet = NewFrontierInstructionSet() homesteadInstructionSet = NewHomesteadInstructionSet() + byzantiumInstructionSet = NewByzantiumInstructionSet() ) +// 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{ + execute: opStaticCall, + gasCost: gasStaticCall, + validateStack: makeStackFunc(6, 1), + memorySize: memoryStaticCall, + valid: true, + returns: 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, + } + instructionSet[REVERT] = operation{ + execute: opRevert, + gasCost: gasRevert, + validateStack: makeStackFunc(2, 0), + memorySize: memoryRevert, + valid: true, + reverts: true, + returns: true, + } + return instructionSet +} + // NewHomesteadInstructionSet returns the frontier and homestead // instructions that can be executed during the homestead phase. func NewHomesteadInstructionSet() [256]operation { @@ -70,6 +104,7 @@ func NewHomesteadInstructionSet() [256]operation { validateStack: makeStackFunc(6, 1), memorySize: memoryDelegateCall, valid: true, + returns: true, } return instructionSet } @@ -255,22 +290,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: { @@ -810,6 +845,7 @@ func NewFrontierInstructionSet() [256]operation { validateStack: makeStackFunc(2, 0), memorySize: memoryLog, valid: true, + writes: true, }, LOG1: { execute: makeLog(1), @@ -817,6 +853,7 @@ func NewFrontierInstructionSet() [256]operation { validateStack: makeStackFunc(3, 0), memorySize: memoryLog, valid: true, + writes: true, }, LOG2: { execute: makeLog(2), @@ -824,6 +861,7 @@ func NewFrontierInstructionSet() [256]operation { validateStack: makeStackFunc(4, 0), memorySize: memoryLog, valid: true, + writes: true, }, LOG3: { execute: makeLog(3), @@ -831,6 +869,7 @@ func NewFrontierInstructionSet() [256]operation { validateStack: makeStackFunc(5, 0), memorySize: memoryLog, valid: true, + writes: true, }, LOG4: { execute: makeLog(4), @@ -838,6 +877,7 @@ func NewFrontierInstructionSet() [256]operation { validateStack: makeStackFunc(6, 0), memorySize: memoryLog, valid: true, + writes: true, }, CREATE: { execute: opCreate, @@ -846,6 +886,7 @@ func NewFrontierInstructionSet() [256]operation { memorySize: memoryCreate, valid: true, writes: true, + returns: true, }, CALL: { execute: opCall, @@ -853,6 +894,7 @@ func NewFrontierInstructionSet() [256]operation { validateStack: makeStackFunc(7, 1), memorySize: memoryCall, valid: true, + returns: true, }, CALLCODE: { execute: opCallCode, @@ -860,6 +902,7 @@ func NewFrontierInstructionSet() [256]operation { validateStack: makeStackFunc(7, 1), memorySize: memoryCall, valid: true, + returns: true, }, RETURN: { execute: opReturn, diff --git a/core/vm/logger.go b/core/vm/logger.go index 522ef97df2..031ca33c13 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 } @@ -86,7 +85,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. @@ -128,26 +127,21 @@ 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 + // 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())) @@ -155,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} @@ -183,8 +161,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 } @@ -196,20 +177,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) } diff --git a/core/vm/logger_test.go b/core/vm/logger_test.go index 9dfbeb215b..dd2aeb1a7f 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/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 9d4c7d7b2b..88e4ec1026 100644 --- a/core/vm/memory_table.go +++ b/core/vm/memory_table.go @@ -26,7 +26,11 @@ 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)) +} + +func memoryReturnDataCopy(stack *Stack) *big.Int { return calcMemSize(stack.Back(0), stack.Back(2)) } @@ -74,10 +78,21 @@ 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)) } +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) diff --git a/core/vm/opcodes.go b/core/vm/opcodes.go index d4ba7f1563..0c65507355 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 @@ -201,7 +202,9 @@ const ( CALLCODE RETURN DELEGATECALL + STATICCALL = 0xfa + REVERT = 0xfd SELFDESTRUCT = 0xff ) @@ -238,27 +241,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", @@ -355,6 +360,8 @@ var opCodeToString = map[OpCode]string{ RETURN: "RETURN", CALLCODE: "CALLCODE", DELEGATECALL: "DELEGATECALL", + STATICCALL: "STATICCALL", + REVERT: "REVERT", SELFDESTRUCT: "SELFDESTRUCT", PUSH: "PUSH", @@ -372,136 +379,140 @@ 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, - "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, + "REVERT": REVERT, + "SELFDESTRUCT": SELFDESTRUCT, } func StringToOp(str string) OpCode { diff --git a/core/vm/runtime/env.go b/core/vm/runtime/env.go index a3fda0869d..6627cfdbf5 100644 --- a/core/vm/runtime/env.go +++ b/core/vm/runtime/env.go @@ -21,11 +21,10 @@ import ( "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/core" - "github.com/ubiq/go-ubiq/core/state" "github.com/ubiq/go-ubiq/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, @@ -37,7 +36,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) diff --git a/core/vm/runtime/runtime.go b/core/vm/runtime/runtime.go index 8e88a8cfd2..ac0ba96744 100644 --- a/core/vm/runtime/runtime.go +++ b/core/vm/runtime/runtime.go @@ -104,7 +104,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) @@ -134,7 +134,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) ) @@ -156,7 +156,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. 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 } diff --git a/crypto/ecies/asn1.go b/crypto/ecies/asn1.go deleted file mode 100644 index a64efa1cf0..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/ubiq/go-ubiq/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 deba14307a..bcc60b8f13 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 15a50f141e..1bf2261e1e 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 { diff --git a/dashboard/README.md b/dashboard/README.md new file mode 100644 index 0000000000..5f44f09dfb --- /dev/null +++ b/dashboard/README.md @@ -0,0 +1,46 @@ +## Go Ubiq 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 Gubiq via `go-bindata` to avoid external dependencies. Rebuilding Gubiq 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 `gubiq` to use external assets to not rely on compiled resources: + +``` +$ (cd dashboard/assets && ./node_modules/.bin/webpack --watch) +$ gubiq --dashboard --dashboard.assets=dashboard/assets/public --vmodule=dashboard=5 +``` + +To bundle up the final UI into Gubiq, 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..9a2e742824 --- /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 Ubiq 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..dff4438c78 --- /dev/null +++ b/dashboard/assets/public/dashboard.html @@ -0,0 +1,17 @@ + + + + + + + + Go Ubiq 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..7beb34b397 --- /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/ubiq/go-ubiq/log" + "github.com/ubiq/go-ubiq/p2p" + "github.com/ubiq/go-ubiq/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/eth/api.go b/eth/api.go index d38b264e9d..7f3d8ed07e 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 Ubiq 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 @@ -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 } } @@ -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 @@ -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 { @@ -543,7 +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}) - 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) } @@ -551,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 @@ -590,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) } @@ -655,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/eth/api_backend.go b/eth/api_backend.go index 430e6a5038..80f2e645a7 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -24,6 +24,7 @@ import ( "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/common/math" "github.com/ubiq/go-ubiq/core" + "github.com/ubiq/go-ubiq/core/bloombits" "github.com/ubiq/go-ubiq/core/state" "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/core/vm" @@ -115,12 +116,28 @@ 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) SendTx(ctx context.Context, signedTx *types.Transaction) error { - return b.eth.txPool.AddLocal(signedTx) +func (b *EthApiBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription { + return b.eth.BlockChain().SubscribeRemovedLogsEvent(ch) } -func (b *EthApiBackend) RemoveTx(txHash common.Hash) { - b.eth.txPool.Remove(txHash) +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) } func (b *EthApiBackend) GetPoolTransactions() (types.Transactions, error) { @@ -151,6 +168,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() } @@ -174,3 +195,14 @@ func (b *EthApiBackend) EventMux() *event.TypeMux { func (b *EthApiBackend) AccountManager() *accounts.Manager { return b.eth.AccountManager() } + +func (b *EthApiBackend) BloomStatus() (uint64, uint64) { + sections, _, _ := b.eth.bloomIndexer.Sections() + return params.BloomBitsBlocks, sections +} + +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 336ee55eea..aa07d9e5b3 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -32,6 +32,7 @@ import ( "github.com/ubiq/go-ubiq/consensus/clique" "github.com/ubiq/go-ubiq/consensus/ubqhash" "github.com/ubiq/go-ubiq/core" + "github.com/ubiq/go-ubiq/core/bloombits" "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/core/vm" "github.com/ubiq/go-ubiq/eth/downloader" @@ -53,19 +54,24 @@ type LesServer interface { Start(srvr *p2p.Server) Stop() Protocols() []p2p.Protocol + SetBloomBitsIndexer(bbIndexer *core.ChainIndexer) } // 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 @@ -73,6 +79,9 @@ type Ethereum struct { engine consensus.Engine accountManager *accounts.Manager + bloomRequests chan chan *bloombits.Retrieval // Channel receiving bloom data retrieval requests + bloomIndexer *core.ChainIndexer // Bloom indexer operating during block imports + ApiBackend *EthApiBackend miner *miner.Miner @@ -87,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 @@ -98,7 +108,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 +120,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, @@ -121,11 +131,10 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { networkId: config.NetworkId, gasPrice: config.GasPrice, etherbase: config.Etherbase, + bloomRequests: make(chan chan *bloombits.Retrieval), + bloomIndexer: NewBloomIndexer(chainDb, params.BloomBitsBlocks), } - if err := addMipmapBloomBins(chainDb); err != nil { - return nil, err - } log.Info("Initialising Ubiq protocol", "versions", ProtocolVersions, "network", config.NetworkId) if !config.SkipBcVersionCheck { @@ -137,7 +146,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 } @@ -147,25 +156,16 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { eth.blockchain.SetHead(compat.RewindTo) core.WriteChainConfig(chainDb, genesisHash, chainConfig) } + eth.bloomIndexer.Start(eth.blockchain) - newPool := core.NewTxPool(config.TxPool, eth.chainConfig, eth.EventMux(), eth.blockchain.State, eth.blockchain.GasLimit) - eth.txPool = newPool - - 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 config.TxPool.Journal != "" { + config.TxPool.Journal = ctx.ResolvePath(config.TxPool.Journal) } + eth.txPool = core.NewTxPool(config.TxPool, eth.chainConfig, eth.blockchain) - 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)) @@ -329,7 +329,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) } @@ -364,17 +364,29 @@ 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 // Ubiq 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()) - 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 + } + } + // Start the networking layer and the light server if requested + s.protocolManager.Start(maxPeers) if s.lesServer != nil { s.lesServer.Start(srvr) } @@ -387,6 +399,7 @@ func (s *Ethereum) Stop() error { if s.stopDbUpgrade != nil { s.stopDbUpgrade() } + s.bloomIndexer.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 f0acc57523..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/ubiq/go-ubiq/common" - "github.com/ubiq/go-ubiq/core" - "github.com/ubiq/go-ubiq/core/types" - "github.com/ubiq/go-ubiq/ethdb" - "github.com/ubiq/go-ubiq/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, new(big.Int)) - receipt.Logs = []*types.Log{{Address: addr}} - gen.AddUncheckedReceipt(receipt) - case 2: - receipt := types.NewReceipt(nil, 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/bind.go b/eth/bind.go index 87e116145c..309472e797 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/eth/bloombits.go b/eth/bloombits.go new file mode 100644 index 0000000000..3173da8b77 --- /dev/null +++ b/eth/bloombits.go @@ -0,0 +1,143 @@ +// 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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/common/bitutil" + "github.com/ubiq/go-ubiq/core" + "github.com/ubiq/go-ubiq/core/bloombits" + "github.com/ubiq/go-ubiq/core/types" + "github.com/ubiq/go-ubiq/ethdb" + "github.com/ubiq/go-ubiq/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) + 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 + } + } + 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, lastSectionHead common.Hash) error { + gen, err := bloombits.NewGenerator(uint(b.size)) + b.gen, b.section, b.head = gen, section, common.Hash{} + return err +} + +// Process implements core.ChainIndexerBackend, adding a new header's bloom into +// the index. +func (b *BloomIndexer) Process(header *types.Header) { + b.gen.AddBloom(uint(header.Number.Uint64()-b.section*b.size), 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/config.go b/eth/config.go index 3842b8cd2c..e2e6944d72 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/db_upgrade.go b/eth/db_upgrade.go index 71a7871fb9..21425eb397 100644 --- a/eth/db_upgrade.go +++ b/eth/db_upgrade.go @@ -19,7 +19,6 @@ package eth import ( "bytes" - "fmt" "time" "github.com/ubiq/go-ubiq/common" @@ -46,7 +45,7 @@ func upgradeDeduplicateData(db ethdb.Database) func() error { return nil } // Start the deduplication upgrade on a new goroutine - log.Info("Upgrading database to use lookup entries") + log.Warn("Upgrading database to use lookup entries") stop := make(chan chan error) go func() { @@ -104,7 +103,7 @@ func upgradeDeduplicateData(db ethdb.Database) func() error { it = db.(*ethdb.LDBDatabase).NewIterator() it.Seek(key) - log.Info("Deduplicating database entries", converted) + log.Info("Deduplicating database entries", "deduped", converted) } // Check for termination, or continue after a bit of a timeout select { @@ -116,10 +115,10 @@ func upgradeDeduplicateData(db ethdb.Database) func() error { } // Upgrade finished, mark a such and terminate if failed == nil { - log.Info("Database deduplication successful", converted) + log.Info("Database deduplication successful", "deduped", converted) db.Put(deduplicateData, []byte{42}) } else { - log.Error("Database deduplication failed.", converted, "err", failed) + log.Error("Database deduplication failed", "deduped", converted, "err", failed) } it.Release() it = nil @@ -134,46 +133,3 @@ func upgradeDeduplicateData(db ethdb.Database) func() error { return <-errc } } - -func addMipmapBloomBins(db ethdb.Database) (err error) { - const mipmapVersion uint = 2 - - // 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 - } - } - - 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 - } - - 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)) - } - log.Info("Bloom-bin upgrade completed", "elapsed", common.PrettyDuration(time.Since(tstart))) - return nil -} diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index f9d7247645..3d38d19a36 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -157,7 +157,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 @@ -334,7 +334,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 @@ -675,7 +675,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 @@ -717,7 +717,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; { @@ -740,7 +740,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 } @@ -1012,8 +1012,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) @@ -1102,6 +1102,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. @@ -1179,7 +1183,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 { @@ -1210,8 +1214,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 @@ -1265,7 +1269,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) } } @@ -1401,7 +1405,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 { @@ -1524,7 +1527,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/downloader_test.go b/eth/downloader/downloader_test.go index a38ff98f1c..5544d99de9 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 } @@ -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: 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)) @@ -466,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 @@ -500,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() @@ -526,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() @@ -551,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() @@ -573,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() @@ -1381,7 +1398,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 +1415,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 +1471,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 +1491,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 +1552,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 +1569,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 +1630,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 +1647,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 @@ -1747,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++ { @@ -1766,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() } } diff --git a/eth/downloader/fakepeer.go b/eth/downloader/fakepeer.go new file mode 100644 index 0000000000..b294d55001 --- /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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/core" + "github.com/ubiq/go-ubiq/core/types" + "github.com/ubiq/go-ubiq/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 <= skip; 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 +} diff --git a/eth/downloader/peer.go b/eth/downloader/peer.go index 8620cc2f7b..1288e18d9a 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 fefac21c82..045d545909 100644 --- a/eth/downloader/statesync.go +++ b/eth/downloader/statesync.go @@ -26,6 +26,7 @@ import ( "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/core/state" "github.com/ubiq/go-ubiq/crypto/sha3" + "github.com/ubiq/go-ubiq/ethdb" "github.com/ubiq/go-ubiq/log" "github.com/ubiq/go-ubiq/trie" ) @@ -39,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. @@ -104,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 ( @@ -142,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. @@ -166,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. @@ -187,10 +211,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 +279,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: @@ -264,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) @@ -284,12 +312,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 +345,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 +352,6 @@ func (s *stateSync) assignTasks() error { } } } - return nil } // fillTasks fills the given request object with a maximum of n state download @@ -347,11 +389,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 +404,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 +414,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 +451,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/fetcher/fetcher.go b/eth/fetcher/fetcher.go index 60cc8af9c0..d09b628a8d 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 ddc684bbdf..c652912835 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/filters/api.go b/eth/filters/api.go index 2737f04c12..34690672de 100644 --- a/eth/filters/api.go +++ b/eth/filters/api.go @@ -52,7 +52,6 @@ type filter struct { // information related to the Ubiq protocol such als blocks, transactions and logs. type PublicFilterAPI struct { backend Backend - useMipMap bool mux *event.TypeMux quit chan struct{} chainDb ethdb.Database @@ -64,14 +63,12 @@ type PublicFilterAPI struct { // NewPublicFilterAPI returns a new PublicFilterAPI instance. func NewPublicFilterAPI(backend Backend, lightMode bool) *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, + mux: backend.EventMux(), + chainDb: backend.ChainDb(), + events: NewEventSystem(backend.EventMux(), backend, lightMode), + filters: make(map[rpc.ID]*filter), } - go api.timeoutLoop() return api @@ -326,20 +323,20 @@ func (api *PublicFilterAPI) NewFilter(crit FilterCriteria) (rpc.ID, error) { // // https://github.com/ubiq/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) - filter := New(api.backend, api.useMipMap) - filter.SetBeginBlock(crit.FromBlock.Int64()) - filter.SetEndBlock(crit.ToBlock.Int64()) - filter.SetAddresses(crit.Addresses) - filter.SetTopics(crit.Topics) - - logs, err := filter.Find(ctx) + logs, err := filter.Logs(ctx) + if err != nil { + return nil, err + } return returnLogs(logs), err } @@ -373,21 +370,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) + begin := rpc.LatestBlockNumber.Int64() if f.crit.FromBlock != nil { - filter.SetBeginBlock(f.crit.FromBlock.Int64()) - } else { - filter.SetBeginBlock(rpc.LatestBlockNumber.Int64()) + begin = f.crit.FromBlock.Int64() } + end := rpc.LatestBlockNumber.Int64() if f.crit.ToBlock != nil { - filter.SetEndBlock(f.crit.ToBlock.Int64()) - } else { - filter.SetEndBlock(rpc.LatestBlockNumber.Int64()) + end = f.crit.ToBlock.Int64() } - filter.SetAddresses(f.crit.Addresses) - filter.SetTopics(f.crit.Topics) + // 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 } @@ -395,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. @@ -504,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 @@ -513,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 0bf33f0f5c..569cfc1017 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/bench_test.go b/eth/filters/bench_test.go new file mode 100644 index 0000000000..16bcade8b3 --- /dev/null +++ b/eth/filters/bench_test.go @@ -0,0 +1,201 @@ +// 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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/common/bitutil" + "github.com/ubiq/go-ubiq/core" + "github.com/ubiq/go-ubiq/core/bloombits" + "github.com/ubiq/go-ubiq/core/types" + "github.com/ubiq/go-ubiq/ethdb" + "github.com/ubiq/go-ubiq/event" + "github.com/ubiq/go-ubiq/node" +) + +func BenchmarkBloomBits512(b *testing.B) { + benchmarkBloomBits(b, 512) +} + +func BenchmarkBloomBits1k(b *testing.B) { + benchmarkBloomBits(b, 1024) +} + +func BenchmarkBloomBits2k(b *testing.B) { + benchmarkBloomBits(b, 2048) +} + +func BenchmarkBloomBits4k(b *testing.B) { + benchmarkBloomBits(b, 4096) +} + +func BenchmarkBloomBits8k(b *testing.B) { + benchmarkBloomBits(b, 8192) +} + +func BenchmarkBloomBits16k(b *testing.B) { + benchmarkBloomBits(b, 16384) +} + +func BenchmarkBloomBits32k(b *testing.B) { + benchmarkBloomBits(b, 32768) +} + +const benchFilterCnt = 2000 + +func benchmarkBloomBits(b *testing.B, sectionSize uint64) { + benchDataDir := node.DefaultDataDir() + "/gubiq/chaindata" + fmt.Println("Running bloombits benchmark section size:", sectionSize) + + 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, 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) + header = core.GetHeader(db, hash, i) + if header == nil { + b.Fatalf("Error creating bloomBits data") + } + bc.AddBloom(uint(i-sectionIdx*sectionSize), header.Bloom) + } + sectionHead := core.GetCanonicalHash(db, (sectionIdx+1)*sectionSize-1) + 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.WriteBloomBits(db, uint(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) + if _, err := filter.Logs(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() + "/gubiq/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{{}}, nil) + 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") + db.Close() +} diff --git a/eth/filters/filter.go b/eth/filters/filter.go index d28ec13630..20cf0fcbe8 100644 --- a/eth/filters/filter.go +++ b/eth/filters/filter.go @@ -18,12 +18,11 @@ package filters import ( "context" - "math" "math/big" - "time" "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/core" + "github.com/ubiq/go-ubiq/core/bloombits" "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/ethdb" "github.com/ubiq/go-ubiq/event" @@ -35,165 +34,186 @@ 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 + + BloomStatus() (uint64, uint64) + ServiceFilter(ctx context.Context, session *bloombits.MatcherSession) } // Filter can be used to retrieve and filter logs. type Filter struct { - backend Backend - useMipMap bool - - created time.Time + backend Backend db ethdb.Database begin, end int64 addresses []common.Address topics [][]common.Hash + + 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 { + // 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)) + 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{ backend: backend, - useMipMap: useMipMap, + begin: begin, + end: end, + addresses: addresses, + topics: topics, db: backend.ChainDb(), + matcher: bloombits.NewMatcher(size, filters), } } -// 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 -// 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 } - - // 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 + // 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 +} - logs, blockNumber := f.mipFind(beginBlockNo, endBlockNo, 0) - f.begin = int64(blockNumber + 1) +// 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(ctx, uint64(f.begin), end, matches) + if err != nil { + return nil, err + } + defer session.Close() + + f.backend.ServiceFilter(ctx, session) + + // Iterate over the matches until exhausted or context closed + var logs []*types.Log + + for { + select { + case number, ok := <-matches: + // Abort if all matches have been fulfilled + if !ok { + 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 { + 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 + } + if bloomFilter(header.Bloom, f.addresses, f.topics) { + found, err := f.checkMatches(ctx, header) + if err != nil { + return logs, err + } + logs = append(logs, found...) + } + } return logs, nil } -// Run filters logs with the current parameters set -func (f *Filter) Find(ctx context.Context) (logs []*types.Log, err error) { - for { - newLogs, err := f.FindOnce(ctx) - if len(newLogs) == 0 || err != nil { - return logs, err - } - logs = append(logs, newLogs...) +// 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 } -} - -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 - } - } else { - l, blockNumber := f.mipFind(start, end, depth+1) - if len(l) > 0 { - return l, blockNumber - } - } - } - } + var unfiltered []*types.Log + for _, receipt := range receipts { + unfiltered = append(unfiltered, receipt.Logs...) } - - return nil, end -} - -func (f *Filter) getLogs(ctx context.Context, start, end uint64) (logs []*types.Log, blockNumber uint64, err error) { - 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) { - // Get the logs of the block - receipts, err := f.backend.GetReceipts(ctx, header.Hash()) - 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 - } - } + logs = filterLogs(unfiltered, nil, nil, f.addresses, f.topics) + if len(logs) > 0 { + return logs, nil } - - return logs, end, nil + return nil, nil } func includes(addresses []common.Address, a common.Address) bool { @@ -221,39 +241,27 @@ 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 } -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 @@ -263,16 +271,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 } @@ -281,6 +288,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 413bc91a3d..5fd2951823 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") ) @@ -74,7 +87,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 @@ -200,7 +212,6 @@ func (es *EventSystem) subscribeMinedPendingLogs(crit FilterCriteria, logs chan installed: make(chan struct{}), err: make(chan error), } - return es.subscribe(sub) } @@ -218,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) } @@ -236,7 +246,6 @@ func (es *EventSystem) subscribePendingLogs(crit FilterCriteria, logs chan []*ty installed: make(chan struct{}), err: make(chan error), } - return es.subscribe(sub) } @@ -253,7 +262,6 @@ func (es *EventSystem) SubscribeNewHeads(headers chan *types.Header) *Subscripti installed: make(chan struct{}), err: make(chan error), } - return es.subscribe(sub) } @@ -270,64 +278,56 @@ func (es *EventSystem) SubscribePendingTxEvents(hashes chan common.Hash) *Subscr installed: make(chan struct{}), err: make(chan error), } - return es.subscribe(sub) } 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 } } }) @@ -396,9 +396,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) } @@ -410,6 +429,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 @@ -428,6 +458,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 35d91f3546..f77fadde4d 100644 --- a/eth/filters/filter_system_test.go +++ b/eth/filters/filter_system_test.go @@ -18,13 +18,16 @@ package filters import ( "context" + "fmt" "math/big" + "math/rand" "reflect" "testing" "time" "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/core" + "github.com/ubiq/go-ubiq/core/bloombits" "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/ethdb" "github.com/ubiq/go-ubiq/event" @@ -33,8 +36,13 @@ import ( ) type testBackend struct { - mux *event.TypeMux - db ethdb.Database + mux *event.TypeMux + db ethdb.Database + sections uint64 + txFeed *event.Feed + rmLogsFeed *event.Feed + logsFeed *event.Feed + chainFeed *event.Feed } func (b *testBackend) ChainDb() ethdb.Database { @@ -63,6 +71,53 @@ 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) +} + +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 + } + } + }() +} + // 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) @@ -74,7 +129,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, 0, 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) {}) @@ -113,7 +172,7 @@ func TestBlockSubscription(t *testing.T) { time.Sleep(1 * time.Second) for _, e := range chainEvents { - mux.Post(e) + chainFeed.Send(e) } <-sub0.Err() @@ -125,10 +184,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, 0, 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), @@ -146,9 +209,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 { @@ -160,10 +224,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]) @@ -175,10 +247,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, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} + api = NewPublicFilterAPI(backend, false) testCases = []struct { crit FilterCriteria @@ -220,10 +296,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, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} + api = NewPublicFilterAPI(backend, false) ) // different situations where log filter creation should fail. @@ -241,15 +321,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, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} + api = NewPublicFilterAPI(backend, false) firstAddr = common.HexToAddress("0x1111111111111111111111111111111111111111") secondAddr = common.HexToAddress("0x2222222222222222222222222222222222222222") @@ -279,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) @@ -300,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:], ""}, } ) @@ -310,8 +396,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) @@ -319,6 +405,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 { @@ -329,6 +416,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) } @@ -349,15 +440,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, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} + api = NewPublicFilterAPI(backend, false) firstAddr = common.HexToAddress("0x1111111111111111111111111111111111111111") secondAddr = common.HexToAddress("0x2222222222222222222222222222222222222222") @@ -366,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{ @@ -378,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}, }}, } @@ -400,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) @@ -412,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}, } ) @@ -439,15 +534,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)) } } }() @@ -455,6 +550,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 f265481ecc..fddc338c8d 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}, } @@ -41,48 +41,46 @@ 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) } 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("ubiq")) - 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, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} + key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + addr1 = crypto.PubkeyToAddress(key1.PublicKey) + addr2 = common.BytesToAddress([]byte("jeff")) + addr3 = common.BytesToAddress([]byte("ubiq")) + addr4 = common.BytesToAddress([]byte("random addresses please")) ) defer db.Close() 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) @@ -98,13 +96,10 @@ 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()) + logs, _ := filter.Logs(context.Background()) if len(logs) != 4 { b.Fatal("expected 4 logs, got", len(logs)) } @@ -112,18 +107,22 @@ 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) } 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, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} + key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + addr = crypto.PubkeyToAddress(key1.PublicKey) hash1 = common.BytesToHash([]byte("topic1")) hash2 = common.BytesToHash([]byte("topic2")) @@ -134,10 +133,9 @@ 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, new(big.Int)) + receipt := types.NewReceipt(nil, false, new(big.Int)) receipt.Logs = []*types.Log{ { Address: addr, @@ -145,9 +143,8 @@ 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, @@ -155,9 +152,8 @@ 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, @@ -165,9 +161,8 @@ 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, @@ -175,12 +170,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) @@ -195,23 +185,15 @@ 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()) + logs, _ := filter.Logs(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) - logs, _ = filter.Find(context.Background()) + filter = New(backend, 900, 999, []common.Address{addr}, [][]common.Hash{{hash3}}) + logs, _ = filter.Logs(context.Background()) if len(logs) != 1 { t.Error("expected 1 log, got", len(logs)) } @@ -219,12 +201,8 @@ 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) - logs, _ = filter.Find(context.Background()) + filter = New(backend, 990, -1, []common.Address{addr}, [][]common.Hash{{hash3}}) + logs, _ = filter.Logs(context.Background()) if len(logs) != 1 { t.Error("expected 1 log, got", len(logs)) } @@ -232,44 +210,32 @@ 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()) + logs, _ = filter.Logs(context.Background()) if len(logs) != 2 { t.Error("expected 2 log, got", len(logs)) } 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()) + logs, _ = filter.Logs(context.Background()) if len(logs) != 0 { t.Error("expected 0 log, got", len(logs)) } 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()) + logs, _ = filter.Logs(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()) + logs, _ = filter.Logs(context.Background()) if len(logs) != 0 { t.Error("expected 0 log, got", len(logs)) } diff --git a/eth/gen_config.go b/eth/gen_config.go index 6715bb6aa2..0c89bba1bc 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 da7c5c62b1..7df044b935 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -45,6 +45,11 @@ 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 +) + // minimim number of peers to broadcast new blocks to minBroadcastPeers = 4 ) @@ -76,7 +81,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 @@ -92,7 +98,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, @@ -101,7 +107,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{}), @@ -196,10 +201,14 @@ func (pm *ProtocolManager) removePeer(id string) { } } -func (pm *ProtocolManager) Start() { +func (pm *ProtocolManager) Start(maxPeers int) { + pm.maxPeers = maxPeers + // 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{}) go pm.minedBroadcastLoop() @@ -385,6 +394,10 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } // Filter out any explicitly requested headers, deliver the rest to the downloader filter := len(headers) == 1 + if filter { + // Irrelevant of the fork checks, send the header to the fetcher just in case + headers = pm.fetcher.FilterHeaders(p.id, headers, time.Now()) + } if len(headers) > 0 || !filter { err := pm.downloader.DeliverHeaders(p.id, headers) if err != nil { @@ -436,7 +449,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) @@ -542,7 +555,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) } } @@ -636,9 +649,10 @@ 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) { + if pm.blockchain.HasBlock(hash, block.NumberU64()) { for _, peer := range peers { peer.SendNewBlockHashes([]common.Hash{hash}, []uint64{block.NumberU64()}) } @@ -671,10 +685,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 5683ca70fe..af2964a08c 100644 --- a/eth/handler_test.go +++ b/eth/handler_test.go @@ -480,9 +480,9 @@ func testBroadcastBlock(t *testing.T, totalPeers, broadcastExpected int) { config = ¶ms.ChainConfig{} 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) + 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) } diff --git a/eth/helper_test.go b/eth/helper_test.go index d6c5dbeb14..ffc31e3b03 100644 --- a/eth/helper_test.go +++ b/eth/helper_test.go @@ -59,18 +59,18 @@ 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 { 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 } @@ -88,15 +88,16 @@ 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 } // 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() @@ -104,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 @@ -124,6 +124,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 9f6bd38770..a1275ec09b 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -22,7 +22,9 @@ import ( "math/big" "github.com/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/core" "github.com/ubiq/go-ubiq/core/types" + "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/rlp" ) @@ -95,11 +97,15 @@ 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. 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/eth/sync.go b/eth/sync.go index c3d183cc9b..fa397c9d9a 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()) @@ -186,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 @@ -199,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) - } - } } diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index e2eb7d63fb..4ce1f83510 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. @@ -203,8 +248,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 @@ -258,6 +301,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) { diff --git a/ethclient/signer.go b/ethclient/signer.go new file mode 100644 index 0000000000..100d64e905 --- /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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/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/ethdb/database.go b/ethdb/database.go index 5f7155048d..d8e7e70121 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/database_test.go b/ethdb/database_test.go index 479eb2b45c..4c718fa881 100644 --- a/ethdb/database_test.go +++ b/ethdb/database_test.go @@ -14,21 +14,179 @@ // 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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/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 { + 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 { + 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() } 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 4c1b70110c..f9b1125dcf 100644 --- a/ethdb/memory_database.go +++ b/ethdb/memory_database.go @@ -45,12 +45,20 @@ 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() if entry, ok := db.db[string(key)]; ok { - return entry, nil + return common.CopyBytes(entry), nil } return nil, errors.New("not found") } @@ -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/ethstats/ethstats.go b/ethstats/ethstats.go index 84e45a8cb9..11ec8f96e6 100644 --- a/ethstats/ethstats.go +++ b/ethstats/ethstats.go @@ -39,21 +39,36 @@ import ( "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/les" "github.com/ubiq/go-ubiq/log" - "github.com/ubiq/go-ubiq/node" "github.com/ubiq/go-ubiq/p2p" "github.com/ubiq/go-ubiq/rpc" "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 Ubiq 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 @@ -121,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 @@ -142,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 } @@ -170,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 { @@ -357,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/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 { 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 } diff --git a/interfaces.go b/interfaces.go index 63b800e7b8..579a50f7c5 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 diff --git a/internal/build/env.go b/internal/build/env.go index e0358924e6..e67cbd7a48 100644 --- a/internal/build/env.go +++ b/internal/build/env.go @@ -82,18 +82,22 @@ func Env() Environment { // LocalEnv returns build environment metadata gathered from git. func LocalEnv() Environment { env := applyEnvFlags(Environment{Name: "local", Repo: "ubiq/go-ubiq"}) - 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 44f6760b95..c6e059f0df 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)) @@ -138,6 +148,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 +171,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)) diff --git a/internal/debug/api.go b/internal/debug/api.go index 268ee86f1e..dbb199cfff 100644 --- a/internal/debug/api.go +++ b/internal/debug/api.go @@ -176,6 +176,17 @@ func (*HandlerT) Stacks() string { return string(buf) } +// FreeOSMemory returns unused memory to the OS. +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/ethapi/api.go b/internal/ethapi/api.go index d3d7d82e63..fd8ff7b881 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. @@ -55,7 +54,7 @@ type PublicEthereumAPI struct { b Backend } -// NewPublicEthereumAPI creates a new Etheruem protocol API. +// NewPublicEthereumAPI creates a new Ubiq protocol API. func NewPublicEthereumAPI(b Backend) *PublicEthereumAPI { return &PublicEthereumAPI{b} } @@ -152,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 { @@ -231,22 +230,45 @@ 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 } +// 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) { @@ -426,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} } @@ -548,26 +570,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"` @@ -578,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 @@ -621,39 +623,42 @@ 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) go func() { - select { - case <-ctx.Done(): - evm.Cancel() - } + <-ctx.Done() + evm.Cancel() }() // 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) + 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. +// 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 - var lo, hi uint64 - if (*big.Int)(&args.Gas).Sign() != 0 { + // Determine the lowest and highest possible gas limits to binary search in between + var ( + lo uint64 = params.TxGas - 1 + hi uint64 + cap 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 @@ -663,29 +668,41 @@ 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 - _, gas, 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 { - lo = mid - continue + // 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 err != nil || failed { + 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 } // 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"` } @@ -693,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 @@ -990,7 +1014,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, @@ -1003,6 +1026,13 @@ 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(receipt.Status) + } if receipt.Logs == nil { fields["logs"] = [][]*types.Log{} } @@ -1080,7 +1110,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 { @@ -1128,29 +1161,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: @@ -1264,7 +1280,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 } @@ -1275,7 +1290,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 @@ -1306,7 +1321,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. @@ -1318,7 +1333,7 @@ func (api *PublicDebugAPI) SeedHash(ctx context.Context, number uint64) (string, return fmt.Sprintf("0x%x", ubqhash.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 diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go index a0776ecaf9..39ddf8c8f8 100644 --- a/internal/ethapi/backend.go +++ b/internal/ethapi/backend.go @@ -53,15 +53,18 @@ 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 - RemoveTx(txHash common.Hash) GetPoolTransactions() (types.Transactions, error) GetPoolTransaction(txHash common.Hash) *types.Transaction 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/internal/ethapi/tracer.go b/internal/ethapi/tracer.go index 477cb9ad88..36fd5b9ea9 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 @@ -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 } 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 ce76500891..204f21a693 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 @@ -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:8588'; - this.timeout = timeout || 0; +var HttpProvider = function (host, timeout, user, password) { + this.host = host || 'http://localhost:8588'; + 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/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) diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index a4d57e6684..32acde9740 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,16 @@ web3._extend({ params: 0, outputFormatter: console.log }), + new web3._extend.Method({ + name: 'freeOSMemory', + 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', @@ -350,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: [] }); @@ -358,8 +374,7 @@ web3._extend({ const Eth_JS = ` web3._extend({ property: 'eth', - methods: - [ + methods: [ new web3._extend.Method({ name: 'sign', call: 'eth_sign', @@ -396,10 +411,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 +425,7 @@ web3._extend({ } return formatted; } - }) + }), ] }); ` @@ -419,8 +433,7 @@ web3._extend({ const Miner_JS = ` web3._extend({ property: 'miner', - methods: - [ + methods: [ new web3._extend.Method({ name: 'start', call: 'miner_start', @@ -451,7 +464,7 @@ web3._extend({ new web3._extend.Method({ name: 'getHashrate', call: 'miner_getHashrate' - }) + }), ], properties: [] }); @@ -461,12 +474,11 @@ const Net_JS = ` web3._extend({ property: 'net', methods: [], - properties: - [ + properties: [ new web3._extend.Property({ name: 'version', getter: 'net_version' - }) + }), ] }); ` @@ -474,8 +486,7 @@ web3._extend({ const Personal_JS = ` web3._extend({ property: 'personal', - methods: - [ + methods: [ new web3._extend.Method({ name: 'importRawKey', call: 'personal_importRawKey', @@ -492,18 +503,22 @@ 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', params: 3 - }) + }), ], - properties: - [ + properties: [ new web3._extend.Property({ name: 'listWallets', getter: 'personal_listWallets' - }) + }), ] }) ` @@ -512,12 +527,11 @@ const RPC_JS = ` web3._extend({ property: 'rpc', methods: [], - properties: - [ + properties: [ new web3._extend.Property({ name: 'modules', getter: 'rpc_modules' - }) + }), ] }); ` @@ -526,109 +540,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: [ @@ -664,7 +575,7 @@ web3._extend({ name: 'listmounts', call: 'swarmfs_listmounts', params: 0 - }) + }), ] }); ` @@ -691,7 +602,7 @@ web3._extend({ status.queued = web3._extend.utils.toDecimal(status.queued); return status; } - }) + }), ] }); ` diff --git a/les/api_backend.go b/les/api_backend.go index f25a06802f..9e4ea1291f 100644 --- a/les/api_backend.go +++ b/les/api_backend.go @@ -24,6 +24,7 @@ import ( "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/common/math" "github.com/ubiq/go-ubiq/core" + "github.com/ubiq/go-ubiq/core/bloombits" "github.com/ubiq/go-ubiq/core/state" "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/core/vm" @@ -124,6 +125,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() } @@ -147,3 +172,17 @@ func (b *LesApiBackend) EventMux() *event.TypeMux { func (b *LesApiBackend) AccountManager() *accounts.Manager { return b.eth.accountManager } + +func (b *LesApiBackend) BloomStatus() (uint64, uint64) { + 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 05d3fb54fd..f716f6e959 100644 --- a/les/backend.go +++ b/les/backend.go @@ -27,6 +27,7 @@ import ( "github.com/ubiq/go-ubiq/common/hexutil" "github.com/ubiq/go-ubiq/consensus" "github.com/ubiq/go-ubiq/core" + "github.com/ubiq/go-ubiq/core/bloombits" "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/eth" "github.com/ubiq/go-ubiq/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 @@ -70,8 +74,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) { @@ -88,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, eth.eventMux); 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.eventMux, 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{} @@ -201,9 +218,13 @@ func (s *LightEthereum) Protocols() []p2p.Protocol { // Start implements node.Service, starting all internal goroutines needed by the // Ubiq 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 } @@ -212,6 +233,15 @@ func (s *LightEthereum) Start(srvr *p2p.Server) error { // Ubiq 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..30c1dc3b40 --- /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/ubiq/go-ubiq/common/bitutil" + "github.com/ubiq/go-ubiq/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/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/fetcher.go b/les/fetcher.go index 5d89b8f868..2a34478df4 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: diff --git a/les/flowcontrol/control.go b/les/flowcontrol/control.go index 7e5b6a50ec..5c41b231e3 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 6febe9e858..2ac9545d78 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/ubiq/go-ubiq/eth/downloader" "github.com/ubiq/go-ubiq/ethdb" "github.com/ubiq/go-ubiq/event" + "github.com/ubiq/go-ubiq/light" "github.com/ubiq/go-ubiq/log" "github.com/ubiq/go-ubiq/p2p" "github.com/ubiq/go-ubiq/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 ) @@ -69,10 +72,8 @@ 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 + HasHeader(hash common.Hash, number uint64) bool GetHeader(hash common.Hash, number uint64) *types.Header GetHeaderByHash(hash common.Hash) *types.Header CurrentHeader() *types.Header @@ -84,11 +85,12 @@ 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 { - // AddRemotes should add the given transactions to the pool. - AddRemotes([]*types.Transaction) error + AddRemotes(txs []*types.Transaction) []error + Status(hashes []common.Hash) []core.TxStatus } type ProtocolManager struct { @@ -119,10 +121,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 @@ -130,7 +128,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, @@ -152,15 +150,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) @@ -320,7 +319,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. @@ -367,11 +366,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) @@ -660,7 +671,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 { @@ -695,9 +706,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() } } } @@ -706,7 +718,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, "") } @@ -715,14 +787,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, } @@ -743,22 +836,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 } } } @@ -767,6 +863,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, "") @@ -787,9 +950,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 @@ -800,14 +984,85 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if reject(uint64(reqCnt), MaxTxSend) { return errResp(ErrRequestRejected, "") } - - if err := pm.txpool.AddRemotes(txs); err != nil { - return errResp(ErrUnexpectedResponse, "msg: %v", err) - } + pm.txpool.AddRemotes(txs) _, 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, "") + } + + hashes := make([]common.Hash, len(req.Txs)) + for i, tx := range req.Txs { + 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] + } + } + + 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, stats) + + 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 + Hashes []common.Hash + } + if err := msg.Decode(&req); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + reqCnt := len(req.Hashes) + if reject(uint64(reqCnt), MaxTxStatus) { + return errResp(ErrRequestRejected, "") + } + 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, pm.txStatus(req.Hashes)) + + case TxStatusMsg: + if pm.odr == nil { + return errResp(ErrUnexpectedResponse, "") + } + + p.Log().Trace("Received tx status response") + var resp struct { + ReqID, BV uint64 + Status []core.TxStatus + } + 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) @@ -825,6 +1080,49 @@ 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) 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} + } + } + } + return stats +} + // 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 1709c871c1..04419b38a8 100644 --- a/les/handler_test.go +++ b/les/handler_test.go @@ -17,8 +17,11 @@ package les import ( + "bytes" + "math/big" "math/rand" "testing" + "time" "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/core" @@ -26,7 +29,9 @@ import ( "github.com/ubiq/go-ubiq/crypto" "github.com/ubiq/go-ubiq/eth/downloader" "github.com/ubiq/go-ubiq/ethdb" + "github.com/ubiq/go-ubiq/light" "github.com/ubiq/go-ubiq/p2p" + "github.com/ubiq/go-ubiq/params" "github.com/ubiq/go-ubiq/rlp" "github.com/ubiq/go-ubiq/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() @@ -305,7 +336,9 @@ 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 TestGetProofsLes2(t *testing.T) { testGetProofs(t, 2) } func testGetProofs(t *testing.T, protocol int) { // Assemble the test environment @@ -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++ { @@ -327,18 +363,139 @@ 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) - 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 txStatus) { + 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, []txStatus{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, 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, 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, txStatus{Status: core.TxStatusQueued}) + test(tx2, true, txStatus{Status: core.TxStatusPending}) + // query again, now tx3 should be pending too + 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) { + block.AddTx(tx1) + block.AddTx(tx2) + }) + 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) + 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) {}) + if _, err := chain.InsertChain(gchain); err != nil { + panic(err) + } + // wait until TxPool processes the reorg + for i := 0; i < 10; i++ { + if pending, _ := txpool.Stats(); pending == 3 { + break + } + 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, txStatus{Status: core.TxStatusPending}) + test(tx2, false, txStatus{Status: core.TxStatusPending}) +} diff --git a/les/helper_test.go b/les/helper_test.go index 60d69f8403..c098c0a9d0 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" @@ -44,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") @@ -140,16 +139,16 @@ 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() } 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) @@ -157,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 } @@ -189,45 +194,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/odr.go b/les/odr.go index 3a155ab21f..7ba8b9f515 100644 --- a/les/odr.go +++ b/les/odr.go @@ -19,6 +19,7 @@ package les import ( "context" + "github.com/ubiq/go-ubiq/core" "github.com/ubiq/go-ubiq/ethdb" "github.com/ubiq/go-ubiq/light" "github.com/ubiq/go-ubiq/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 e91ec260a9..bae72866f8 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 56bc8be61a..20b1c1e0d6 100644 --- a/les/odr_test.go +++ b/les/odr_test.go @@ -29,6 +29,7 @@ import ( "github.com/ubiq/go-ubiq/core/state" "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/core/vm" + "github.com/ubiq/go-ubiq/eth" "github.com/ubiq/go-ubiq/ethdb" "github.com/ubiq/go-ubiq/light" "github.com/ubiq/go-ubiq/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 } @@ -127,7 +136,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 +147,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...) } @@ -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 88a7a9c90b..a38b3f0256 100644 --- a/les/peer.go +++ b/les/peer.go @@ -18,6 +18,8 @@ package les import ( + "crypto/ecdsa" + "encoding/binary" "errors" "fmt" "math/big" @@ -28,6 +30,7 @@ import ( "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/eth" "github.com/ubiq/go-ubiq/les/flowcontrol" + "github.com/ubiq/go-ubiq/light" "github.com/ubiq/go-ubiq/p2p" "github.com/ubiq/go-ubiq/rlp" ) @@ -38,19 +41,25 @@ var ( errNotRegistered = errors.New("peer is not registered") ) +const maxResponseErrors = 50 // number of invalid responses tolerated (makes the protocol less brittle but still avoids spam) + const ( - maxHeadInfoLen = 20 - maxResponseErrors = 50 // number of invalid responses tolerated (makes the protocol less brittle but still avoids spam) + 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 @@ -71,9 +80,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, @@ -200,16 +211,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, stats []txStatus) error { + return sendResponse(p.rw, TxStatusMsg, reqID, bv, stats) +} + // 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 { @@ -233,7 +259,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) } @@ -245,20 +271,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 { @@ -292,7 +356,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 @@ -336,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) @@ -351,6 +415,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 { @@ -395,6 +462,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 { @@ -459,11 +529,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) } } @@ -471,8 +545,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 } @@ -481,8 +553,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 } @@ -491,19 +567,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 e2b9f5892d..3537010b88 100644 --- a/les/protocol.go +++ b/les/protocol.go @@ -18,25 +18,35 @@ package les import ( + "bytes" + "crypto/ecdsa" + "crypto/elliptic" + "errors" "fmt" "io" "math/big" "github.com/ubiq/go-ubiq/common" - "github.com/ubiq/go-ubiq/core/types" + "github.com/ubiq/go-ubiq/core" + "github.com/ubiq/go-ubiq/crypto" + "github.com/ubiq/go-ubiq/crypto/secp256k1" "github.com/ubiq/go-ubiq/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 = 88 @@ -54,13 +64,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 @@ -80,7 +98,7 @@ const ( ErrUnexpectedResponse ErrInvalidResponse ErrTooManyTimeouts - ErrHandshakeMissingKey + ErrMissingKey ) func (e errCode) String() string { @@ -102,13 +120,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 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) +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. @@ -118,11 +136,32 @@ 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 +// 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 { @@ -131,12 +170,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,18 +214,15 @@ 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 } type proofsData [][]rlp.RawValue + +type txStatus struct { + Status core.TxStatus + Lookup *core.TxLookupEntry + Error error +} diff --git a/les/request_test.go b/les/request_test.go index fee973a9de..d9b6c9aef8 100644 --- a/les/request_test.go +++ b/les/request_test.go @@ -24,6 +24,7 @@ import ( "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/core" "github.com/ubiq/go-ubiq/crypto" + "github.com/ubiq/go-ubiq/eth" "github.com/ubiq/go-ubiq/ethdb" "github.com/ubiq/go-ubiq/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 55ab872cd4..c392df0282 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 628248ca7a..4707783cd4 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/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/core" @@ -34,7 +35,6 @@ import ( "github.com/ubiq/go-ubiq/p2p" "github.com/ubiq/go-ubiq/p2p/discv5" "github.com/ubiq/go-ubiq/rlp" - "github.com/ubiq/go-ubiq/trie" ) type LesServer struct { @@ -42,24 +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{} - stopped bool + + 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{ @@ -78,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() { @@ -118,16 +160,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 @@ -282,19 +314,17 @@ func (s *requestCostStats) update(msgCode, reqCnt, cost uint64) { func (pm *ProtocolManager) blockLoop() { pm.wg.Add(1) - sub := pm.eventMux.Subscribe(core.ChainHeadEvent{}) - newCht := make(chan struct{}, 10) - newCht <- struct{}{} + headCh := make(chan core.ChainHeadEvent, 10) + headSub := pm.blockchain.SubscribeChainHeadEvent(headCh) go func() { - var mu sync.Mutex var lastHead *types.Header 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) @@ -309,114 +339,42 @@ 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: - sub.Unsubscribe() + headSub.Unsubscribe() pm.wg.Done() return } } }() } - -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/les/serverpool.go b/les/serverpool.go index f9e33c1619..d6d8250c87 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 diff --git a/light/lightchain.go b/light/lightchain.go index 5eb0e9f852..4654122416 100644 --- a/light/lightchain.go +++ b/light/lightchain.go @@ -44,15 +44,17 @@ 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 - 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 @@ -70,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) @@ -78,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, @@ -94,10 +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: 805, Root: common.HexToHash("85e4286fe0a730390245c49de8476977afdae0eb5530b277f62a52b12313d50f")}) - log.Info("Added trusted CHT for mainnet") + if cp, ok := trustedCheckpoints[bc.genesisBlock.Hash()]; ok { + bc.addTrustedCheckpoint(cp) } if err := bc.loadLastState(); err != nil { @@ -114,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 } @@ -251,8 +266,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 } @@ -317,16 +332,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) } } @@ -415,8 +432,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 @@ -441,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() @@ -468,3 +488,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 2737c272aa..c82f572ee4 100644 --- a/light/lightchain_test.go +++ b/light/lightchain_test.go @@ -18,7 +18,6 @@ package light import ( "context" - "fmt" "math/big" "testing" @@ -27,7 +26,6 @@ import ( "github.com/ubiq/go-ubiq/core" "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/ethdb" - "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/params" ) @@ -56,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, ubqhash.NewFaker(), new(event.TypeMux)) + blockchain, _ := NewLightChain(&dummyOdr{db: db}, gspec.Config, ubqhash.NewFaker()) // Create and inject the requested chain if n == 0 { @@ -76,7 +74,7 @@ func newTestLightChain() *LightChain { Config: params.TestChainConfig, } gspec.MustCommit(db) - lc, err := NewLightChain(&dummyOdr{db: db}, gspec.Config, ubqhash.NewFullFaker(), new(event.TypeMux)) + lc, err := NewLightChain(&dummyOdr{db: db}, gspec.Config, ubqhash.NewFullFaker()) if err != nil { panic(err) } @@ -98,10 +96,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 +112,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 { @@ -350,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, ubqhash.NewFaker(), new(event.TypeMux)) + ncm, err := NewLightChain(&dummyOdr{db: bc.chainDb}, params.TestChainConfig, ubqhash.NewFaker()) if err != nil { t.Fatalf("failed to create new chain manager: %v", err) } diff --git a/light/nodeset.go b/light/nodeset.go new file mode 100644 index 0000000000..26ac257408 --- /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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/crypto" + "github.com/ubiq/go-ubiq/rlp" + "github.com/ubiq/go-ubiq/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 26cf3939a0..54a69dfa5f 100644 --- a/light/odr.go +++ b/light/odr.go @@ -25,9 +25,7 @@ import ( "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/core" "github.com/ubiq/go-ubiq/core/types" - "github.com/ubiq/go-ubiq/crypto" "github.com/ubiq/go-ubiq/ethdb" - "github.com/ubiq/go-ubiq/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 d3df396cbf..1bf3cd5929 100644 --- a/light/odr_test.go +++ b/light/odr_test.go @@ -33,7 +33,6 @@ import ( "github.com/ubiq/go-ubiq/core/vm" "github.com/ubiq/go-ubiq/crypto" "github.com/ubiq/go-ubiq/ethdb" - "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/params" "github.com/ubiq/go-ubiq/rlp" "github.com/ubiq/go-ubiq/trie" @@ -78,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[:]) } @@ -181,7 +182,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() @@ -233,7 +234,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 +241,14 @@ func testChainOdr(t *testing.T, protocol int, fn odrTestFn) { ) gspec.MustCommit(ldb) // Assemble the test environment - blockchain, _ := core.NewBlockChain(sdb, params.TestChainConfig, ubqhash.NewFullFaker(), evmux, vm.Config{}) + blockchain, _ := core.NewBlockChain(sdb, params.TestChainConfig, ubqhash.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, ubqhash.NewFullFaker(), evmux) + lightchain, err := NewLightChain(odr, params.TestChainConfig, ubqhash.NewFullFaker()) if err != nil { t.Fatal(err) } diff --git a/light/odr_util.go b/light/odr_util.go index 8891070664..114123bd61 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/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/core" "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/crypto" - "github.com/ubiq/go-ubiq/ethdb" "github.com/ubiq/go-ubiq/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..7549f78466 --- /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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/common/bitutil" + "github.com/ubiq/go-ubiq/core" + "github.com/ubiq/go-ubiq/core/types" + "github.com/ubiq/go-ubiq/ethdb" + "github.com/ubiq/go-ubiq/log" + "github.com/ubiq/go-ubiq/params" + "github.com/ubiq/go-ubiq/rlp" + "github.com/ubiq/go-ubiq/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/light/trie_test.go b/light/trie_test.go index e73a388fdf..35c84ff7a0 100644 --- a/light/trie_test.go +++ b/light/trie_test.go @@ -28,7 +28,6 @@ import ( "github.com/ubiq/go-ubiq/core/state" "github.com/ubiq/go-ubiq/core/vm" "github.com/ubiq/go-ubiq/ethdb" - "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/params" "github.com/ubiq/go-ubiq/trie" ) @@ -41,7 +40,7 @@ func TestNodeIterator(t *testing.T) { genesis = gspec.MustCommit(fulldb) ) gspec.MustCommit(lightdb) - blockchain, _ := core.NewBlockChain(fulldb, params.TestChainConfig, ubqhash.NewFullFaker(), new(event.TypeMux), vm.Config{}) + blockchain, _ := core.NewBlockChain(fulldb, params.TestChainConfig, ubqhash.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 643320ab06..a3f9782bf1 100644 --- a/light/txpool.go +++ b/light/txpool.go @@ -33,6 +33,11 @@ import ( "github.com/ubiq/go-ubiq/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.HomesteadSigner{}, - 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 @@ -124,12 +132,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 @@ -280,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 } } } @@ -307,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() @@ -394,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 d6bfbe92b9..270649b625 100644 --- a/light/txpool_test.go +++ b/light/txpool_test.go @@ -29,7 +29,6 @@ import ( "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/core/vm" "github.com/ubiq/go-ubiq/ethdb" - "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/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, ubqhash.NewFullFaker(), evmux, vm.Config{}) + blockchain, _ := core.NewBlockChain(sdb, params.TestChainConfig, ubqhash.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, ubqhash.NewFullFaker(), evmux) + lightchain, _ := NewLightChain(odr, params.TestChainConfig, ubqhash.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/log/format.go b/log/format.go index d52b22bc57..6ba73a81c5 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) diff --git a/metrics/metrics.go b/metrics/metrics.go index 8854ce14be..1eff7ed022 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -29,7 +29,8 @@ import ( ) // MetricsEnabledFlag is the CLI flag name to use to enable metrics collections. -var MetricsEnabledFlag = "metrics" +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 } @@ -112,10 +113,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/miner/agent.go b/miner/agent.go index 3c00f3864a..6e959c6f53 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{}) { diff --git a/miner/remote_agent.go b/miner/remote_agent.go index 61f331f504..c9ac23c7cd 100644 --- a/miner/remote_agent.go +++ b/miner/remote_agent.go @@ -163,13 +163,14 @@ 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 // 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 b2cbd23ca4..3165843569 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -23,9 +23,9 @@ import ( "sync/atomic" "time" - "github.com/ubiq/go-ubiq/accounts" "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/consensus" + "github.com/ubiq/go-ubiq/consensus/misc" "github.com/ubiq/go-ubiq/core" "github.com/ubiq/go-ubiq/core/state" "github.com/ubiq/go-ubiq/core/types" @@ -40,6 +40,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 @@ -62,7 +70,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 @@ -86,9 +93,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 @@ -107,16 +119,11 @@ 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 mining int32 atWork int32 - - fullValidation bool } func newWorker(config *params.ChainConfig, engine consensus.Engine, coinbase common.Address, eth Backend, mux *event.TypeMux) *worker { @@ -125,18 +132,23 @@ 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(), 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), - fullValidation: false, + unconfirmed: newUnconfirmedBlocks(eth.BlockChain(), miningLogAtDepth), } - 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() @@ -228,27 +240,48 @@ 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) + txset := types.NewTransactionsByPriceAndNonce(self.current.signer, txs) 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 + case <-self.txSub.Err(): + return + case <-self.chainHeadSub.Err(): + return + case <-self.chainSideSub.Err(): + return } } } @@ -265,53 +298,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 { - 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 - for _, r := range work.receipts { - for _, l := range r.Logs { - l.BlockHash = block.Hash() - } - } - for _, log := range work.state.Logs() { - log.BlockHash = block.Hash() - } - - // 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) - // Write map map bloom filters - core.WriteMipmapBloom(self.chainDb, block.NumberU64(), work.receipts) - // 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}) - self.mux.Post(core.ChainEvent{Block: block, Hash: block.Hash(), Logs: logs}) - - if stat == core.CanonStatTy { - self.mux.Post(core.ChainHeadEvent{Block: block}) - self.mux.Post(logs) - } - 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) } + 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()) @@ -360,11 +378,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 @@ -423,11 +437,9 @@ 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) - self.eth.TxPool().RemoveBatch(work.failedTxs) - // compute uncles for the new block. var ( uncles []*types.Header @@ -512,6 +524,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...) @@ -519,10 +541,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() } } diff --git a/mobile/accounts.go b/mobile/accounts.go index ed3aafd26d..73c8c2244c 100644 --- a/mobile/accounts.go +++ b/mobile/accounts.go @@ -25,6 +25,7 @@ import ( "github.com/ubiq/go-ubiq/accounts" "github.com/ubiq/go-ubiq/accounts/keystore" + "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/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 Ubiq 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 9cd512f5cc..7996933f63 100644 --- a/mobile/big.go +++ b/mobile/big.go @@ -21,6 +21,8 @@ package gubiq import ( "errors" "math/big" + + "github.com/ubiq/go-ubiq/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 427350d100..f17cb36acd 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 } @@ -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 } diff --git a/mobile/common.go b/mobile/common.go index 960bbca6a9..80802db13f 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/doc.go b/mobile/doc.go index 5601a734e9..d888008531 100644 --- a/mobile/doc.go +++ b/mobile/doc.go @@ -17,7 +17,7 @@ // Package gubiq contains the simplified mobile APIs to go-ethereum. // // The scope of this package is *not* to allow writing a custom Ubiq client -// with pieces plucked from go-ethereum, rather to allow writing native dapps on +// with pieces plucked from go-ubiq, rather to allow writing native dapps on // mobile platforms. Keep this in mind when using or extending this package! // // API limitations diff --git a/mobile/ethclient.go b/mobile/ethclient.go index b1a09e2a36..293b25532c 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) @@ -191,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 } diff --git a/mobile/ethereum.go b/mobile/ethereum.go index 5289f07e3f..076c92ee75 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 e3eccef7ed..03e1c0518e 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 } @@ -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/mobile/types.go b/mobile/types.go index cedd5d7abb..c99b74bbba 100644 --- a/mobile/types.go +++ b/mobile/types.go @@ -23,6 +23,7 @@ import ( "errors" "fmt" + "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/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 @@ -260,15 +261,19 @@ 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) { - 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 +284,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, common.CopyBytes(sig)) return &Transaction{rawTx}, err } @@ -310,7 +319,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 diff --git a/node/api.go b/node/api.go index 94e9c98649..d4818adb77 100644 --- a/node/api.go +++ b/node/api.go @@ -17,15 +17,17 @@ package node import ( + "context" "fmt" "strings" "time" - "github.com/rcrowley/go-metrics" "github.com/ubiq/go-ubiq/common/hexutil" "github.com/ubiq/go-ubiq/crypto" "github.com/ubiq/go-ubiq/p2p" "github.com/ubiq/go-ubiq/p2p/discover" + "github.com/ubiq/go-ubiq/rpc" + "github.com/rcrowley/go-metrics" ) // PrivateAdminAPI is the collection of administrative API methods exposed only @@ -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 6f7f5b8311..cbf7d48315 100644 --- a/node/config.go +++ b/node/config.go @@ -35,7 +35,7 @@ import ( "github.com/ubiq/go-ubiq/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 @@ -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 @@ -160,7 +167,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. @@ -316,8 +323,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)) } @@ -353,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-ubiq-keystore") ephemeral = keydir } + if err != nil { return nil, "", err } @@ -393,11 +408,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/node/defaults.go b/node/defaults.go index 55fb7405d2..f1e1afacd1 100644 --- a/node/defaults.go +++ b/node/defaults.go @@ -42,7 +42,7 @@ var DefaultConfig = Config{ WSModules: []string{"net", "web3"}, P2P: p2p.Config{ ListenAddr: ":30388", - DiscoveryV5Addr: ":30304", + DiscoveryV5Addr: ":30389", MaxPeers: 25, NAT: nat.Any(), }, 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: 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 ae1191af0f..bd66238bd2 100644 --- a/node/node.go +++ b/node/node.go @@ -25,7 +25,6 @@ import ( "reflect" "strings" "sync" - "syscall" "github.com/ubiq/go-ubiq/accounts" "github.com/ubiq/go-ubiq/ethdb" @@ -34,16 +33,7 @@ import ( "github.com/ubiq/go-ubiq/log" "github.com/ubiq/go-ubiq/p2p" "github.com/ubiq/go-ubiq/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 @@ -160,7 +150,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() @@ -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 } @@ -275,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() @@ -426,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 @@ -439,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 } @@ -455,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 @@ -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 } @@ -568,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/node/utils_test.go b/node/utils_test.go index a78a5e4f0a..ea92fd5c8c 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. diff --git a/p2p/dial.go b/p2p/dial.go index 4eca229e5f..695fc6bbb3 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 1024530db0..c79a6f2c49 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 0e11b01ed8..4d203ada82 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 c4682b1c7a..fb96121104 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/discover/table.go b/p2p/discover/table.go index 92e60bf3cc..1abaea878c 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/p2p/discover/udp_test.go b/p2p/discover/udp_test.go index dfdbdeda8e..402b7f5ba0 100644 --- a/p2p/discover/udp_test.go +++ b/p2p/discover/udp_test.go @@ -297,7 +297,7 @@ func TestUDP_findnodeMultiReply(t *testing.T) { // send the reply as two packets. list := []*Node{ - MustParseNode("enode://ba85011c70bcc5c04d8607d3a0ed29aa6179c092cbdda10d5d32684fb33ed01bd94f588ca8f91ac48318087dcb02eaf36773a7a453f0eedd6742af668097b29c@10.0.1.16:30388?discport=30304"), + MustParseNode("enode://ba85011c70bcc5c04d8607d3a0ed29aa6179c092cbdda10d5d32684fb33ed01bd94f588ca8f91ac48318087dcb02eaf36773a7a453f0eedd6742af668097b29c@10.0.1.16:30388?discport=30389"), MustParseNode("enode://81fa361d25f157cd421c60dcc28d8dac5ef6a89476633339c5df30287474520caca09627da18543d9079b5b288698b542d56167aa5c09111e55acdbbdf2ef799@10.0.1.16:30388"), MustParseNode("enode://9bffefd833d53fac8e652415f4973bee289e8b1a5c6c4cbe70abf817ce8a64cee11b823b66a987f51aaa9fba0d6a91b3e6bf0d5a5d1042de8e9eeea057b217f8@10.0.1.36:30386?discport=17"), MustParseNode("enode://1b5b4aa662d7cb44a7221bfba67302590b643028197a7d5214790f3bac7aaa4a3241be9e83c09cf1f6c69d007c634faae3dc1b1221793e8446c0b3a09de65960@10.0.1.16:30388"), diff --git a/p2p/discv5/udp_test.go b/p2p/discv5/udp_test.go index 88b611db6e..4cc421f8d6 100644 --- a/p2p/discv5/udp_test.go +++ b/p2p/discv5/udp_test.go @@ -189,7 +189,7 @@ var ( // // // send the reply as two packets. // list := []*Node{ -// MustParseNode("enode://ba85011c70bcc5c04d8607d3a0ed29aa6179c092cbdda10d5d32684fb33ed01bd94f588ca8f91ac48318087dcb02eaf36773a7a453f0eedd6742af668097b29c@10.0.1.16:30388?discport=30304"), +// MustParseNode("enode://ba85011c70bcc5c04d8607d3a0ed29aa6179c092cbdda10d5d32684fb33ed01bd94f588ca8f91ac48318087dcb02eaf36773a7a453f0eedd6742af668097b29c@10.0.1.16:30388?discport=30389"), // MustParseNode("enode://81fa361d25f157cd421c60dcc28d8dac5ef6a89476633339c5df30287474520caca09627da18543d9079b5b288698b542d56167aa5c09111e55acdbbdf2ef799@10.0.1.16:30388"), // MustParseNode("enode://9bffefd833d53fac8e652415f4973bee289e8b1a5c6c4cbe70abf817ce8a64cee11b823b66a987f51aaa9fba0d6a91b3e6bf0d5a5d1042de8e9eeea057b217f8@10.0.1.36:30386?discport=17"), // MustParseNode("enode://1b5b4aa662d7cb44a7221bfba67302590b643028197a7d5214790f3bac7aaa4a3241be9e83c09cf1f6c69d007c634faae3dc1b1221793e8446c0b3a09de65960@10.0.1.16:30388"), diff --git a/p2p/message.go b/p2p/message.go index b398cf4c19..93b6faaaa3 100644 --- a/p2p/message.go +++ b/p2p/message.go @@ -25,6 +25,8 @@ import ( "sync/atomic" "time" + "github.com/ubiq/go-ubiq/event" + "github.com/ubiq/go-ubiq/p2p/discover" "github.com/ubiq/go-ubiq/rlp" ) @@ -245,3 +247,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/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) } diff --git a/p2p/peer.go b/p2p/peer.go index 7c961643c1..c8643847cc 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -25,16 +25,19 @@ import ( "time" "github.com/ubiq/go-ubiq/common/mclock" + "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/log" "github.com/ubiq/go-ubiq/p2p/discover" "github.com/ubiq/go-ubiq/rlp" ) const ( - baseProtocolVersion = 4 + baseProtocolVersion = 5 baseProtocolLength = uint64(16) baseProtocolMaxMsgSize = 2 * 1024 + snappyProtocolVersion = 5 + pingInterval = 15 * time.Second ) @@ -60,6 +63,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 +106,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. @@ -190,7 +228,7 @@ loop: } func (p *Peer) pingLoop() { - ping := time.NewTicker(pingInterval) + ping := time.NewTimer(pingInterval) defer p.wg.Done() defer ping.Stop() for { @@ -200,6 +238,7 @@ func (p *Peer) pingLoop() { p.protoErr <- err return } + ping.Reset(pingInterval) case <-p.closed: return } @@ -296,9 +335,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/rlpx.go b/p2p/rlpx.go index a8b719179f..773db50741 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/ubiq/go-ubiq/crypto/sha3" "github.com/ubiq/go-ubiq/p2p/discover" "github.com/ubiq/go-ubiq/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 } diff --git a/p2p/server.go b/p2p/server.go index 52d4a9d50c..82f6777ec3 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -27,6 +27,7 @@ import ( "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/common/mclock" + "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/log" "github.com/ubiq/go-ubiq/p2p/discover" "github.com/ubiq/go-ubiq/p2p/discv5" @@ -128,10 +129,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. @@ -164,6 +169,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) @@ -189,7 +195,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 @@ -289,6 +295,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() @@ -356,7 +367,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) @@ -534,7 +545,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. @@ -542,6 +557,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 @@ -550,7 +570,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) @@ -663,16 +687,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 @@ -753,7 +777,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 4edd9eb2bf..f69b2e4106 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..8177748b0d --- /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 (`30388` and `8589` 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..996ae21e01 --- /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/ubiq/go-ubiq/node" + "github.com/ubiq/go-ubiq/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..0bf4c57afc --- /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/ubiq/go-ubiq/log" + "github.com/ubiq/go-ubiq/node" + "github.com/ubiq/go-ubiq/p2p" + "github.com/ubiq/go-ubiq/p2p/discover" + "github.com/ubiq/go-ubiq/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..578ff9b49a --- /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/ubiq/go-ubiq/event" + "github.com/ubiq/go-ubiq/node" + "github.com/ubiq/go-ubiq/p2p" + "github.com/ubiq/go-ubiq/p2p/discover" + "github.com/ubiq/go-ubiq/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}, 30388, 30388) +} + +// 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..0c90212f26 --- /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/ubiq/go-ubiq/crypto" + "github.com/ubiq/go-ubiq/node" + "github.com/ubiq/go-ubiq/p2p" + "github.com/ubiq/go-ubiq/p2p/discover" + "github.com/ubiq/go-ubiq/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 Gubiq 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..0647a6df4e --- /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/ubiq/go-ubiq/log" + "github.com/ubiq/go-ubiq/node" + "github.com/ubiq/go-ubiq/p2p" + "github.com/ubiq/go-ubiq/p2p/discover" + "github.com/ubiq/go-ubiq/p2p/simulations" + "github.com/ubiq/go-ubiq/p2p/simulations/adapters" + "github.com/ubiq/go-ubiq/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..654507dc9a --- /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/ubiq/go-ubiq/event" + "github.com/ubiq/go-ubiq/p2p" + "github.com/ubiq/go-ubiq/p2p/discover" + "github.com/ubiq/go-ubiq/p2p/simulations/adapters" + "github.com/ubiq/go-ubiq/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..4d9056aaef --- /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/ubiq/go-ubiq/event" + "github.com/ubiq/go-ubiq/node" + "github.com/ubiq/go-ubiq/p2p" + "github.com/ubiq/go-ubiq/p2p/discover" + "github.com/ubiq/go-ubiq/p2p/simulations/adapters" + "github.com/ubiq/go-ubiq/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..6cf6322c12 --- /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/ubiq/go-ubiq/event" + "github.com/ubiq/go-ubiq/log" + "github.com/ubiq/go-ubiq/p2p" + "github.com/ubiq/go-ubiq/p2p/discover" + "github.com/ubiq/go-ubiq/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..8cc806df1d --- /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/ubiq/go-ubiq/p2p/discover" + "github.com/ubiq/go-ubiq/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..e177fd0127 --- /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/ubiq/go-ubiq/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/params/config.go b/params/config.go index 6eb20d3573..76c87b9c1a 100644 --- a/params/config.go +++ b/params/config.go @@ -32,13 +32,13 @@ var ( var ( // MainnetChainConfig is the chain parameters to run a node on the main network. MainnetChainConfig = &ChainConfig{ - ChainId: big.NewInt(8), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP150Hash: common.HexToHash("0x406f1b7dd39fca54d8c702141851ed8b755463ab5b560e6f19b963b4047418af"), - EIP155Block: big.NewInt(10), - EIP158Block: big.NewInt(10), - MetropolisBlock: big.NewInt(math.MaxInt64), // Don't enable yet + ChainId: big.NewInt(8), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP150Hash: common.HexToHash("0x406f1b7dd39fca54d8c702141851ed8b755463ab5b560e6f19b963b4047418af"), + EIP155Block: big.NewInt(10), + EIP158Block: big.NewInt(10), + ByzantiumBlock: big.NewInt(math.MaxInt64), // Don't enable yet Ubqhash: new(UbqhashConfig), } @@ -51,38 +51,27 @@ var ( EIP150Hash: common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d"), EIP155Block: big.NewInt(10), EIP158Block: big.NewInt(10), - MetropolisBlock: big.NewInt(math.MaxInt64), // Don't enable yet + ByzantiumBlock: big.NewInt(math.MaxInt64), // Don't enable yet Ubqhash: new(UbqhashConfig), } - // RinkebyChainConfig contains the chain parameters to run a node on the Rinkeby test network. - RinkebyChainConfig = &ChainConfig{ - ChainId: big.NewInt(4), - HomesteadBlock: big.NewInt(1), - 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 - - Clique: &CliqueConfig{ - Period: 15, - Epoch: 30000, - }, - } - - // AllProtocolChanges contains every protocol change (EIPs) - // introduced and accepted by the Ubiq core developers. + // AllUbqhashProtocolChanges contains every protocol change (EIPs) introduced + // and accepted by the Ubiq core developers into the Ubqhash 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), big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(math.MaxInt64) /*disabled*/, new(UbqhashConfig), nil} - TestChainConfig = &ChainConfig{big.NewInt(1), big.NewInt(0), big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), nil, new(UbqhashConfig), 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. + AllUbqhashProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), new(UbqhashConfig), nil} + + // AllCliqueProtocolChanges contains every protocol change (EIPs) introduced + // and accepted by the Ubiq 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(UbqhashConfig), nil} + TestRules = TestChainConfig.Rules(new(big.Int)) ) // ChainConfig is the core config which determines the blockchain settings. @@ -97,16 +86,16 @@ type ChainConfig struct { // 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 - 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 = already on byzantium) // Various consensus engines Ubqhash *UbqhashConfig `json:"ubqhash,omitempty"` - Clique *CliqueConfig `json:"clique,omitempty"` + Clique *CliqueConfig `json:"clique,omitempty"` } // UbqhashConfig is the consensus engine configs for proof-of-work based sealing. @@ -139,13 +128,13 @@ func (c *ChainConfig) String() string { default: engine = "unknown" } - return fmt.Sprintf("{ChainID: %v Homestead: %v EIP150: %v EIP155: %v EIP158: %v Metropolis: %v Engine: %v}", + return fmt.Sprintf("{ChainID: %v Homestead: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Engine: %v}", c.ChainId, c.HomesteadBlock, c.EIP150Block, c.EIP155Block, c.EIP158Block, - c.MetropolisBlock, + c.ByzantiumBlock, engine, ) } @@ -167,8 +156,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). @@ -182,7 +171,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 } @@ -222,8 +211,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 } @@ -291,7 +280,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 { @@ -299,5 +288,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/params/config_test.go b/params/config_test.go index 487dc380c5..650a19ee15 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: AllUbqhashProtocolChanges, new: AllUbqhashProtocolChanges, head: 0, wantErr: nil}, + {stored: AllUbqhashProtocolChanges, new: AllUbqhashProtocolChanges, 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: AllUbqhashProtocolChanges, new: &ChainConfig{HomesteadBlock: nil}, head: 3, wantErr: &ConfigCompatError{ @@ -49,7 +49,7 @@ func TestCheckCompatible(t *testing.T) { }, }, { - stored: AllProtocolChanges, + stored: AllUbqhashProtocolChanges, new: &ChainConfig{HomesteadBlock: big.NewInt(1)}, head: 3, wantErr: &ConfigCompatError{ 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, diff --git a/accounts/usbwallet/usbwallet.go b/params/network_params.go similarity index 73% rename from accounts/usbwallet/usbwallet.go rename to params/network_params.go index 938ab1e6a2..536a46d3df 100644 --- a/accounts/usbwallet/usbwallet.go +++ b/params/network_params.go @@ -14,12 +14,13 @@ // 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 +package params -// 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 -} +// 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 +) diff --git a/params/protocol_params.go b/params/protocol_params.go index f48bf4992d..c56faf56f8 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 = 20 // Divisor for the quadratic particle of the big int modular exponentiation + Bn256AddGas uint64 = 500 // Gas needed for an elliptic curve addition + 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 ) var ( diff --git a/params/version.go b/params/version.go index fece15a276..29fdfb5be1 100644 --- a/params/version.go +++ b/params/version.go @@ -22,7 +22,7 @@ import ( const ( VersionMajor = 2 // Major version component of the current release - VersionMinor = 1 // Minor version component of the current release + VersionMinor = 2 // Minor version component of the current release VersionPatch = 0 // Patch version component of the current release VersionMeta = "lit" // Version metadata to append to the version string ) 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 67ce6e2ceb..7a73471503 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) + } } } diff --git a/rpc/client.go b/rpc/client.go index e7a4b85e77..c7fa068582 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 f5b4acdde2..9327a6f86b 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/rpc/http.go b/rpc/http.go index 4143e2a8dc..5941c06776 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -20,9 +20,11 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "io" "io/ioutil" + "mime" "net" "net/http" "sync" @@ -32,6 +34,7 @@ import ( ) const ( + contentType = "application/json" maxHTTPRequestContentLength = 1024 * 128 ) @@ -68,8 +71,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) { @@ -145,22 +148,42 @@ 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) { - if r.ContentLength > maxHTTPRequestContentLength { - http.Error(w, - fmt.Sprintf("content length too large (%d>%d)", r.ContentLength, maxHTTPRequestContentLength), - http.StatusRequestEntityTooLarge) + // Permit dumb empty requests for remote health-checks (AWS) + if r.Method == "GET" && r.ContentLength == 0 && r.URL.RawQuery == "" { 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. + 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", contentType) srv.ServeSingleRequest(codec, OptionMethodInvocation) } +// 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" { + return http.StatusMethodNotAllowed, errors.New("method not allowed") + } + if r.ContentLength > maxHTTPRequestContentLength { + err := fmt.Errorf("content length too large (%d>%d)", r.ContentLength, maxHTTPRequestContentLength) + return http.StatusRequestEntityTooLarge, err + } + mt, _, err := mime.ParseMediaType(r.Header.Get("content-type")) + if err != nil || mt != contentType { + err := fmt.Errorf("invalid content type, only %s is supported", contentType) + return http.StatusUnsupportedMediaType, err + } + return 0, nil +} + 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..1cb7a7acbf --- /dev/null +++ b/rpc/http_test.go @@ -0,0 +1,54 @@ +// 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 ( + "net/http" + "net/http/httptest" + "strings" + "testing" +) + +func TestHTTPErrorResponseWithDelete(t *testing.T) { + testHTTPErrorResponse(t, "DELETE", contentType, "", http.StatusMethodNotAllowed) +} + +func TestHTTPErrorResponseWithPut(t *testing.T) { + testHTTPErrorResponse(t, "PUT", contentType, "", http.StatusMethodNotAllowed) +} + +func TestHTTPErrorResponseWithMaxContentLength(t *testing.T) { + body := make([]rune, maxHTTPRequestContentLength+1, maxHTTPRequestContentLength+1) + testHTTPErrorResponse(t, + "POST", contentType, string(body), http.StatusRequestEntityTooLarge) +} + +func TestHTTPErrorResponseWithEmptyContentType(t *testing.T) { + testHTTPErrorResponse(t, "POST", "", "", http.StatusUnsupportedMediaType) +} + +func TestHTTPErrorResponseWithValidRequest(t *testing.T) { + testHTTPErrorResponse(t, "POST", contentType, "", 0) +} + +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 code, _ := validateRequest(request); code != expected { + t.Fatalf("response code should be %d not %d", expected, code) + } +} diff --git a/rpc/server.go b/rpc/server.go index 68d07b19f0..9fab4166bd 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..0ba177e63b 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 @@ -286,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 } @@ -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 e459b272a8..4ebb5feb61 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 diff --git a/rpc/websocket.go b/rpc/websocket.go index b9876dd83b..65181b2937 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) } diff --git a/swarm/api/api.go b/swarm/api/api.go index cc2c6ccc29..b2e55c69c6 100644 --- a/swarm/api/api.go +++ b/swarm/api/api.go @@ -34,11 +34,7 @@ import ( "github.com/ubiq/go-ubiq/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) @@ -136,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 } @@ -147,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) @@ -335,7 +336,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 +356,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 c3802c8a5d..3aa7d4dcd0 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) } @@ -246,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/api/http/error.go b/swarm/api/http/error.go new file mode 100644 index 0000000000..6aa4694c1e --- /dev/null +++ b/swarm/api/http/error.go @@ -0,0 +1,154 @@ +// 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" + "strings" + "time" + + "github.com/ubiq/go-ubiq/log" + "github.com/ubiq/go-ubiq/swarm/api" +) + +//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() + multipleChoicesPage := GetMultipleChoicesErrorPage() + //map the codes to the available pages + tnames := map[int]string{ + 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 { + //assign formatted HTML to the code + templateMap[code] = template.Must(template.New(fmt.Sprintf("%d", code)).Parse(tname)) + } +} + +//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 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) { + 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. +//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..2c20ba8f99 --- /dev/null +++ b/swarm/api/http/error_templates.go @@ -0,0 +1,553 @@ +// 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 +} + +//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}}
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ Your request yields ambiguous results! +
+ Your request may refer to: +
+ {{ .Details}} +
+ 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..e9a9e40f91 --- /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/ubiq/go-ubiq/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 response 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 02811cfd6b..515d8690c6 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 @@ -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 } @@ -442,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 { @@ -496,48 +518,55 @@ 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 // 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)) 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 + } + + //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.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 } @@ -550,14 +579,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() { @@ -573,7 +602,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) @@ -581,7 +610,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) @@ -605,7 +634,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) } } @@ -637,11 +666,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 12346737a6..2f2a938c26 100644 --- a/swarm/api/http/server_test.go +++ b/swarm/api/http/server_test.go @@ -18,12 +18,17 @@ package http_test import ( "bytes" + "errors" + "fmt" "io/ioutil" "net/http" + "strings" "sync" "testing" "github.com/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/swarm/api" + swarm "github.com/ubiq/go-ubiq/swarm/api/client" "github.com/ubiq/go-ubiq/swarm/storage" "github.com/ubiq/go-ubiq/swarm/testutil" ) @@ -93,7 +98,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)) } } @@ -106,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 { @@ -122,9 +127,70 @@ func TestBzzrGetPath(t *testing.T) { } defer resp.Body.Close() respbody, err = ioutil.ReadAll(resp.Body) - if string(respbody) != nonhashresponses[i] { + if err != nil { + t.Fatalf("ReadAll failed: %v", err) + } + if !strings.Contains(string(respbody), nonhashresponses[i]) { t.Fatalf("Non-Hash response body does not match, expected: %v, got: %v", nonhashresponses[i], string(respbody)) } } } + +// 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) + } +} diff --git a/swarm/api/manifest.go b/swarm/api/manifest.go index 3c354bcc68..2428ac830b 100644 --- a/swarm/api/manifest.go +++ b/swarm/api/manifest.go @@ -22,6 +22,8 @@ import ( "errors" "fmt" "io" + "net/http" + "strings" "sync" "time" @@ -63,7 +65,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 @@ -236,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 @@ -292,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 @@ -422,25 +424,47 @@ func (self *manifestTrie) findPrefixOf(path string, quitC chan bool) (entry *man return self.entries[256], 0 } - b := byte(path[0]) + //see if first char is in manifest entries + b := 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 cbca75134b..c6019c997f 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) { } diff --git a/swarm/fuse/fuse_file.go b/swarm/fuse/fuse_file.go index d574847d0c..418f42d00e 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/ubiq/go-ubiq/log" - "github.com/ubiq/go-ubiq/swarm/storage" - "golang.org/x/net/context" "io" "os" "sync" + + "bazil.org/fuse" + "bazil.org/fuse/fs" + "github.com/ubiq/go-ubiq/log" + "github.com/ubiq/go-ubiq/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 @@ -134,7 +135,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 diff --git a/swarm/fuse/swarmfs_test.go b/swarm/fuse/swarmfs_test.go index 7787cba187..a052fb66c8 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) } diff --git a/swarm/fuse/swarmfs_unix.go b/swarm/fuse/swarmfs_unix.go index 3c24b65298..0778c3201d 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/depo.go b/swarm/network/depo.go index 236b1b887c..436816e2d4 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, @@ -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/hive.go b/swarm/network/hive.go index 3870ed0623..7a455b018c 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/kademlia/address.go b/swarm/network/kademlia/address.go index fbbdfb076c..4a7fe6e381 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 9df0bf0ad5..2b49f06dbc 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/messages.go b/swarm/network/messages.go index 732999829a..aa831c94e5 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 4202555dee..9572c17933 100644 --- a/swarm/network/protocol.go +++ b/swarm/network/protocol.go @@ -40,7 +40,6 @@ import ( "github.com/ubiq/go-ubiq/contracts/chequebook" "github.com/ubiq/go-ubiq/log" "github.com/ubiq/go-ubiq/p2p" - "github.com/ubiq/go-ubiq/p2p/discover" bzzswap "github.com/ubiq/go-ubiq/swarm/services/swap" "github.com/ubiq/go-ubiq/swarm/services/swap/swap" "github.com/ubiq/go-ubiq/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 @@ -312,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 c7927aa839..4dae1105a1 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 @@ -379,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 d55875369d..98cd6e75ea 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" // 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. 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. @@ -66,25 +58,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 + 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) { @@ -93,7 +79,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 } @@ -113,13 +100,30 @@ 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) @@ -128,6 +132,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 @@ -156,19 +162,23 @@ func (self *TreeChunker) Split(data io.Reader, size int64, chunkC chan *Chunk, s close(errC) }() + defer close(quitC) select { case err := <-errC: if err != nil { - close(quitC) return nil, err } - //TODO: add a timeout + case <-time.NewTimer(splitTimeout).C: + return nil, errOperationTimedOut } + return key, nil } 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-- @@ -195,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)) @@ -224,12 +234,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}: @@ -238,6 +251,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() @@ -250,7 +265,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 @@ -261,9 +275,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, @@ -286,6 +302,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 @@ -299,7 +319,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 40f870246f..20ccae98db 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/ubiq/go-ubiq/crypto/sha3" ) /* @@ -43,14 +45,7 @@ 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) { +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) @@ -61,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 @@ -75,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 { @@ -100,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])) @@ -143,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) } @@ -163,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) @@ -183,43 +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) - } -} - -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) } } @@ -241,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) } @@ -290,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 d39d75687e..cdac5d8728 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 e597e44980..4042992c71 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/ubiq/go-ubiq/log" @@ -68,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 @@ -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() @@ -432,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 } @@ -446,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/dbstore_test.go b/swarm/storage/dbstore_test.go index cdd9c931db..cda5a1e62e 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/dpa.go b/swarm/storage/dpa.go index bb6bb0b51a..4cbfdcde6a 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..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 @@ -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 f7c3cf784a..44ec3e214f 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 @@ -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 9951483c5b..d2d925d22c 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/ubiq/go-ubiq/log" @@ -37,10 +36,9 @@ 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 - lock sync.Mutex } // backend engine for cloud store @@ -71,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, @@ -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 d4390d1298..5de385dcbe 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/ubiq/go-ubiq/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 thereby 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,129 +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: 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: 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 boundary.. 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) - } - select { - case chunkC <- &Chunk{Key: hash, SData: data, wg: swg}: - // case <- self.quitC - } - } - 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 + +} 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 2fc232beba..a9afc81e19 100644 --- a/swarm/storage/types.go +++ b/swarm/storage/types.go @@ -24,11 +24,13 @@ import ( "io" "sync" + "github.com/ubiq/go-ubiq/bmt" "github.com/ubiq/go-ubiq/common" "github.com/ubiq/go-ubiq/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 @@ -77,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 } @@ -191,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 { diff --git a/swarm/swarm.go b/swarm/swarm.go index ae67f17759..4dfc179c87 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) diff --git a/tests/block_test.go b/tests/block_test.go index 09977bcc72..669d3ca08a 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -17,10 +17,7 @@ package tests import ( - "math/big" "testing" - - "github.com/ubiq/go-ubiq/params" ) func TestBlockchain(t *testing.T) { @@ -30,49 +27,17 @@ 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`) - // Expected failures: - bt.fails(`(?i)metropolis`, "metropolis is not supported yet") - bt.fails(`^TestNetwork/bcTheDaoTest\.json/(DaoTransactions$|DaoTransactions_UncleExtradata$)`, "issue in test") + 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)`) - bt.config(`^TestNetwork/`, params.ChainConfig{ - HomesteadBlock: big.NewInt(5), - 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), - }) + // Still failing tests + bt.skipLoad(`^bcWalletTest.*_Byzantium$`) 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 97785e9ee0..98a9fedf97 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -33,7 +33,6 @@ import ( "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/core/vm" "github.com/ubiq/go-ubiq/ethdb" - "github.com/ubiq/go-ubiq/event" "github.com/ubiq/go-ubiq/params" "github.com/ubiq/go-ubiq/rlp" ) @@ -53,6 +52,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 +91,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) @@ -105,7 +110,7 @@ func (t *BlockTest) Run(config *params.ChainConfig) 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, ubqhash.NewShared(), new(event.TypeMux), vm.Config{}) + chain, err := core.NewBlockChain(db, config, ubqhash.NewShared(), vm.Config{}) if err != nil { return err } diff --git a/tests/difficulty_test.go b/tests/difficulty_test.go new file mode 100644 index 0000000000..61164838ed --- /dev/null +++ b/tests/difficulty_test.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 . +// + +package tests + +import ( + "testing" + + "math/big" + + "github.com/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/params" +) + +var ( + mainnetChainConfig = params.ChainConfig{ + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(1150000), + 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..b012b370fe --- /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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/common/math" + "github.com/ubiq/go-ubiq/consensus/ubqhash" + "github.com/ubiq/go-ubiq/core/types" + "github.com/ubiq/go-ubiq/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 := ubqhash.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..f2c08ceab2 --- /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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/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/gen_stlog.go b/tests/gen_stlog.go deleted file mode 100644 index eaa58bf5e7..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/ubiq/go-ubiq/common" - "github.com/ubiq/go-ubiq/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/init.go b/tests/init.go new file mode 100644 index 0000000000..ec08657290 --- /dev/null +++ b/tests/init.go @@ -0,0 +1,65 @@ +// 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/ubiq/go-ubiq/params" +) + +// This table defines supported forks and their chain config. +var Forks = map[string]*params.ChainConfig{ + "Frontier": { + ChainId: big.NewInt(1), + }, + "Homestead": { + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + }, + "EIP150": { + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + }, + "EIP158": { + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + }, + "FrontierToHomesteadAt5": { + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(5), + }, + "HomesteadToEIP150At5": { + ChainId: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: 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/init_test.go b/tests/init_test.go index 26d9f2d2f4..d7117e1b26 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 13dc033518..430164623a 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -33,27 +33,34 @@ 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)`, - "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/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(`^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 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" { + 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) }) }) } @@ -61,7 +68,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/state_test_util.go b/tests/state_test_util.go index 28f54bcc16..29cfa6f617 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/ubiq/go-ubiq/common" @@ -33,41 +31,12 @@ import ( "github.com/ubiq/go-ubiq/core/types" "github.com/ubiq/go-ubiq/core/vm" "github.com/ubiq/go-ubiq/crypto" + "github.com/ubiq/go-ubiq/crypto/sha3" "github.com/ubiq/go-ubiq/ethdb" "github.com/ubiq/go-ubiq/params" + "github.com/ubiq/go-ubiq/rlp" ) -// 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 { @@ -94,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"` @@ -139,26 +108,11 @@ 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 for fork, pss := range t.json.Post { - for i, _ := range pss { + for i := range pss { sub = append(sub, StateSubtest{fork, i}) } } @@ -166,10 +120,10 @@ 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] +func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) (*state.StateDB, error) { + config, ok := Forks[subtest.Fork] if !ok { - return fmt.Errorf("no config for fork %q", subtest.Fork) + return nil, UnsupportedForkError{subtest.Fork} } block, _ := t.genesis(config).ToBlock() db, _ := ethdb.NewMemDatabase() @@ -178,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 @@ -187,19 +141,17 @@ 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 { - if err := checkLogs(statedb.Logs(), *post.Logs); err != nil { - return err - } + if logs := rlpHash(statedb.Logs()); logs != common.Hash(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 { @@ -285,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 f1de8c3b7f..37f555fbc0 160000 --- a/tests/testdata +++ b/tests/testdata @@ -1 +1 @@ -Subproject commit f1de8c3b7fa2c2c0aa281b6b3a1ad7010356c5ff +Subproject commit 37f555fbc091fbf761aa6f02227132fb31f0681c diff --git a/tests/transaction_test.go b/tests/transaction_test.go index 81ea1fd662..cec0e568d8 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) { diff --git a/tests/vm_test.go b/tests/vm_test.go index 8852854a6d..c96121ac1c 100644 --- a/tests/vm_test.go +++ b/tests/vm_test.go @@ -26,6 +26,9 @@ func TestVM(t *testing.T) { t.Parallel() vmt := new(testMatcher) vmt.fails("^vmSystemOperationsTest.json/createNameRegistrator$", "fails without parallel execution") + + 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 6202cef376..85f393d8a5 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) { diff --git a/trie/hasher.go b/trie/hasher.go index 7e3f3b1bd9..1b7bf2d561 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) diff --git a/trie/proof.go b/trie/proof.go index 356394527b..8cba097587 100644 --- a/trie/proof.go +++ b/trie/proof.go @@ -18,11 +18,10 @@ package trie import ( "bytes" - "errors" "fmt" "github.com/ubiq/go-ubiq/common" - "github.com/ubiq/go-ubiq/crypto/sha3" + "github.com/ubiq/go-ubiq/crypto" "github.com/ubiq/go-ubiq/log" "github.com/ubiq/go-ubiq/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 7d0776dd1d..3fec133586 100644 --- a/trie/proof_test.go +++ b/trie/proof_test.go @@ -24,7 +24,8 @@ import ( "time" "github.com/ubiq/go-ubiq/common" - "github.com/ubiq/go-ubiq/rlp" + "github.com/ubiq/go-ubiq/crypto" + "github.com/ubiq/go-ubiq/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) } } diff --git a/trie/sync.go b/trie/sync.go index f7aa961726..63f04ce97f 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 } @@ -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 37a5591058..5c5e84caad 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. diff --git a/trie/trie_test.go b/trie/trie_test.go index cc4b777fc1..6da331e9b7 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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/crypto" "github.com/ubiq/go-ubiq/ethdb" + "github.com/ubiq/go-ubiq/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) { 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/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/github.com/karalabe/hid/hid_enabled.go b/vendor/github.com/karalabe/hid/hid_enabled.go index e95e5792d9..ed17e760da 100644 --- a/vendor/github.com/karalabe/hid/hid_enabled.go +++ b/vendor/github.com/karalabe/hid/hid_enabled.go @@ -58,6 +58,11 @@ import ( // > "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() +} + // Supported returns whether this platform is supported by the HID library or not. // The goal of this method is to allow programatically handling platforms that do // not support USB HID and not having to fall back to build constraints. 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/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/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/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/github.com/syndtr/goleveldb/leveldb/db.go b/vendor/github.com/syndtr/goleveldb/leveldb/db.go index b27c38d37e..0de5ffe8d7 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db.go @@ -468,7 +468,7 @@ func recoverTable(s *session, o *opt.Options) error { } // Commit. - return s.commit(rec) + return s.commit(rec, false) } func (db *DB) recoverJournal() error { @@ -538,7 +538,7 @@ func (db *DB) recoverJournal() error { rec.setJournalNum(fd.Num) rec.setSeqNum(db.seq) - if err := db.s.commit(rec); err != nil { + if err := db.s.commit(rec, false); err != nil { fr.Close() return err } @@ -617,7 +617,7 @@ func (db *DB) recoverJournal() error { // Commit. rec.setJournalNum(db.journalFd.Num) rec.setSeqNum(db.seq) - if err := db.s.commit(rec); err != nil { + if err := db.s.commit(rec, false); err != nil { // Close journal on error. if db.journal != nil { db.journal.Close() @@ -872,6 +872,10 @@ func (db *DB) Has(key []byte, ro *opt.ReadOptions) (ret bool, err error) { // DB. And a nil Range.Limit is treated as a key after all keys in // the DB. // +// WARNING: Any slice returned by interator (e.g. slice returned by calling +// Iterator.Key() or Iterator.Key() methods), its content should not be modified +// unless noted otherwise. +// // The iterator must be released after use, by calling Release method. // // Also read Iterator documentation of the leveldb/iterator package. @@ -953,15 +957,27 @@ func (db *DB) GetProperty(name string) (value string, err error) { value = "Compactions\n" + " Level | Tables | Size(MB) | Time(sec) | Read(MB) | Write(MB)\n" + "-------+------------+---------------+---------------+---------------+---------------\n" + var totalTables int + var totalSize, totalRead, totalWrite int64 + var totalDuration time.Duration for level, tables := range v.levels { duration, read, write := db.compStats.getStat(level) if len(tables) == 0 && duration == 0 { continue } + totalTables += len(tables) + totalSize += tables.size() + totalRead += read + totalWrite += write + totalDuration += duration value += fmt.Sprintf(" %3d | %10d | %13.5f | %13.5f | %13.5f | %13.5f\n", level, len(tables), float64(tables.size())/1048576.0, duration.Seconds(), float64(read)/1048576.0, float64(write)/1048576.0) } + value += "-------+------------+---------------+---------------+---------------+---------------\n" + value += fmt.Sprintf(" Total | %10d | %13.5f | %13.5f | %13.5f | %13.5f\n", + totalTables, float64(totalSize)/1048576.0, totalDuration.Seconds(), + float64(totalRead)/1048576.0, float64(totalWrite)/1048576.0) case p == "iostats": value = fmt.Sprintf("Read(MB):%.5f Write(MB):%.5f", float64(db.s.stor.reads())/1048576.0, @@ -1013,10 +1029,10 @@ type DBStats struct { BlockCacheSize int OpenedTablesCount int - LevelSizes []int64 + LevelSizes Sizes LevelTablesCounts []int - LevelRead []int64 - LevelWrite []int64 + LevelRead Sizes + LevelWrite Sizes LevelDurations []time.Duration } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go index 0c1b9a53b8..56f3632a7d 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go @@ -260,7 +260,7 @@ func (db *DB) compactionCommit(name string, rec *sessionRecord) { db.compCommitLk.Lock() defer db.compCommitLk.Unlock() // Defer is necessary. db.compactionTransactFunc(name+"@commit", func(cnt *compactionTransactCounter) error { - return db.s.commit(rec) + return db.s.commit(rec, true) }, nil) } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_snapshot.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_snapshot.go index 2c69d2e531..c2ad70c847 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_snapshot.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db_snapshot.go @@ -142,6 +142,10 @@ func (snap *Snapshot) Has(key []byte, ro *opt.ReadOptions) (ret bool, err error) // DB. And a nil Range.Limit is treated as a key after all keys in // the DB. // +// WARNING: Any slice returned by interator (e.g. slice returned by calling +// Iterator.Key() or Iterator.Value() methods), its content should not be +// modified unless noted otherwise. +// // The iterator must be released after use, by calling Release method. // Releasing the snapshot doesn't mean releasing the iterator too, the // iterator would be still valid until released. diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go index b8f7e7d21d..f145b64fbb 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go @@ -69,6 +69,10 @@ func (tr *Transaction) Has(key []byte, ro *opt.ReadOptions) (bool, error) { // DB. And a nil Range.Limit is treated as a key after all keys in // the DB. // +// WARNING: Any slice returned by interator (e.g. slice returned by calling +// Iterator.Key() or Iterator.Key() methods), its content should not be modified +// unless noted otherwise. +// // The iterator must be released after use, by calling Release method. // // Also read Iterator documentation of the leveldb/iterator package. @@ -205,7 +209,7 @@ func (tr *Transaction) Commit() error { tr.stats.startTimer() var cerr error for retry := 0; retry < 3; retry++ { - cerr = tr.db.s.commit(&tr.rec) + cerr = tr.db.s.commit(&tr.rec, false) if cerr != nil { tr.db.logf("transaction@commit error R·%d %q", retry, cerr) select { diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/session.go b/vendor/github.com/syndtr/goleveldb/leveldb/session.go index 3f391f9346..1bec34c4c3 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/session.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/session.go @@ -180,19 +180,19 @@ func (s *session) recover() (err error) { } s.manifestFd = fd - s.setVersion(staging.finish()) + s.setVersion(staging.finish(false)) s.setNextFileNum(rec.nextFileNum) s.recordCommited(rec) return nil } // Commit session; need external synchronization. -func (s *session) commit(r *sessionRecord) (err error) { +func (s *session) commit(r *sessionRecord, trivial bool) (err error) { v := s.version() defer v.release() // spawn new version based on current version - nv := v.spawn(r) + nv := v.spawn(r, trivial) if s.manifest == nil { // manifest journal writer not yet created, create one diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/table.go b/vendor/github.com/syndtr/goleveldb/leveldb/table.go index 1fac60d050..518e1db1cd 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/table.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/table.go @@ -150,6 +150,14 @@ func (tf tFiles) searchMax(icmp *iComparer, ikey internalKey) int { }) } +// Searches smallest index of tables whose its file number +// is smaller than the given number. +func (tf tFiles) searchNumLess(num int64) int { + return sort.Search(len(tf), func(i int) bool { + return tf[i].fd.Num < num + }) +} + // Returns true if given key range overlaps with one or more // tables key range. If unsorted is true then binary search will not be used. func (tf tFiles) overlaps(icmp *iComparer, umin, umax []byte, unsorted bool) bool { diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/version.go b/vendor/github.com/syndtr/goleveldb/leveldb/version.go index 73f272af5f..51361e5d80 100644 --- a/vendor/github.com/syndtr/goleveldb/leveldb/version.go +++ b/vendor/github.com/syndtr/goleveldb/leveldb/version.go @@ -273,10 +273,10 @@ func (v *version) newStaging() *versionStaging { } // Spawn a new version based on this version. -func (v *version) spawn(r *sessionRecord) *version { +func (v *version) spawn(r *sessionRecord, trivial bool) *version { staging := v.newStaging() staging.commit(r) - return staging.finish() + return staging.finish(trivial) } func (v *version) fillRecord(r *sessionRecord) { @@ -446,7 +446,7 @@ func (p *versionStaging) commit(r *sessionRecord) { } } -func (p *versionStaging) finish() *version { +func (p *versionStaging) finish(trivial bool) *version { // Build new version. nv := newVersion(p.base.s) numLevel := len(p.levels) @@ -463,6 +463,12 @@ func (p *versionStaging) finish() *version { if level < len(p.levels) { scratch := p.levels[level] + // Short circuit if there is no change at all. + if len(scratch.added) == 0 && len(scratch.deleted) == 0 { + nv.levels[level] = baseTabels + continue + } + var nt tFiles // Prealloc list if possible. if n := len(baseTabels) + len(scratch.added) - len(scratch.deleted); n > 0 { @@ -480,6 +486,41 @@ func (p *versionStaging) finish() *version { nt = append(nt, t) } + // Avoid resort if only files in this level are deleted + if len(scratch.added) == 0 { + nv.levels[level] = nt + continue + } + + // For normal table compaction, one compaction will only involve two levels + // of files. And the new files generated after merging the source level and + // source+1 level related files can be inserted as a whole into source+1 level + // without any overlap with the other source+1 files. + // + // When the amount of data maintained by leveldb is large, the number of files + // per level will be very large. While qsort is very inefficient for sorting + // already ordered arrays. Therefore, for the normal table compaction, we use + // binary search here to find the insert index to insert a batch of new added + // files directly instead of using qsort. + if trivial && len(scratch.added) > 0 { + added := make(tFiles, 0, len(scratch.added)) + for _, r := range scratch.added { + added = append(added, tableFileFromRecord(r)) + } + if level == 0 { + added.sortByNum() + index := nt.searchNumLess(added[len(added)-1].fd.Num) + nt = append(nt[:index], append(added, nt[index:]...)...) + } else { + added.sortByKey(p.base.s.icmp) + _, amax := added.getRange(p.base.s.icmp) + index := nt.searchMin(p.base.s.icmp, amax) + nt = append(nt[:index], append(added, nt[index:]...)...) + } + nv.levels[level] = nt + continue + } + // New tables. for _, r := range scratch.added { nt = append(nt, tableFileFromRecord(r)) diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/CMakeLists.txt b/vendor/github.com/ubiq/ubqhash/src/libubqhash/CMakeLists.txt deleted file mode 100644 index 44a63a1c5b..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/CMakeLists.txt +++ /dev/null @@ -1,44 +0,0 @@ -set(LIBRARY ubqhash) - -if (CPPETHEREUM) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") -endif () - -set(CMAKE_BUILD_TYPE Release) - -if (NOT MSVC) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") -endif() - -set(FILES util.h - io.c - internal.c - ubqhash.h - endian.h - compiler.h - fnv.h - data_sizes.h) - -if (MSVC) - list(APPEND FILES util_win32.c io_win32.c mmap_win32.c) -else() - list(APPEND FILES io_posix.c) -endif() - -if (NOT CRYPTOPP_FOUND) - find_package(CryptoPP 7.0.0) -endif() - -if (CRYPTOPP_FOUND) - add_definitions(-DWITH_CRYPTOPP) - include_directories( ${CRYPTOPP_INCLUDE_DIRS} ) - list(APPEND FILES sha3_cryptopp.cpp sha3_cryptopp.h blake2_cryptopp.cpp blake2_cryptopp.h) -else() - list(APPEND FILES sha3.c sha3.h blake2b-ref.c blake2-impl.h blake2.h) -endif() - -add_library(${LIBRARY} ${FILES}) - -if (CRYPTOPP_FOUND) - TARGET_LINK_LIBRARIES(${LIBRARY} ${CRYPTOPP_LIBRARIES}) -endif() diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/blake2-impl.h b/vendor/github.com/ubiq/ubqhash/src/libubqhash/blake2-impl.h deleted file mode 100644 index 5dff7fc7a3..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/blake2-impl.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ -#ifndef BLAKE2_IMPL_H -#define BLAKE2_IMPL_H - -#include -#include - -#if !defined(__cplusplus) && (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L) - #if defined(_MSC_VER) - #define BLAKE2_INLINE __inline - #elif defined(__GNUC__) - #define BLAKE2_INLINE __inline__ - #else - #define BLAKE2_INLINE - #endif -#else - #define BLAKE2_INLINE inline -#endif - -static BLAKE2_INLINE uint32_t load32( const void *src ) -{ -#if defined(NATIVE_LITTLE_ENDIAN) - uint32_t w; - memcpy(&w, src, sizeof w); - return w; -#else - const uint8_t *p = ( const uint8_t * )src; - return (( uint32_t )( p[0] ) << 0) | - (( uint32_t )( p[1] ) << 8) | - (( uint32_t )( p[2] ) << 16) | - (( uint32_t )( p[3] ) << 24) ; -#endif -} - -static BLAKE2_INLINE uint64_t load64( const void *src ) -{ -#if defined(NATIVE_LITTLE_ENDIAN) - uint64_t w; - memcpy(&w, src, sizeof w); - return w; -#else - const uint8_t *p = ( const uint8_t * )src; - return (( uint64_t )( p[0] ) << 0) | - (( uint64_t )( p[1] ) << 8) | - (( uint64_t )( p[2] ) << 16) | - (( uint64_t )( p[3] ) << 24) | - (( uint64_t )( p[4] ) << 32) | - (( uint64_t )( p[5] ) << 40) | - (( uint64_t )( p[6] ) << 48) | - (( uint64_t )( p[7] ) << 56) ; -#endif -} - -static BLAKE2_INLINE uint16_t load16( const void *src ) -{ -#if defined(NATIVE_LITTLE_ENDIAN) - uint16_t w; - memcpy(&w, src, sizeof w); - return w; -#else - const uint8_t *p = ( const uint8_t * )src; - return (( uint16_t )( p[0] ) << 0) | - (( uint16_t )( p[1] ) << 8) ; -#endif -} - -static BLAKE2_INLINE void store16( void *dst, uint16_t w ) -{ -#if defined(NATIVE_LITTLE_ENDIAN) - memcpy(dst, &w, sizeof w); -#else - uint8_t *p = ( uint8_t * )dst; - *p++ = ( uint8_t )w; w >>= 8; - *p++ = ( uint8_t )w; -#endif -} - -static BLAKE2_INLINE void store32( void *dst, uint32_t w ) -{ -#if defined(NATIVE_LITTLE_ENDIAN) - memcpy(dst, &w, sizeof w); -#else - uint8_t *p = ( uint8_t * )dst; - p[0] = (uint8_t)(w >> 0); - p[1] = (uint8_t)(w >> 8); - p[2] = (uint8_t)(w >> 16); - p[3] = (uint8_t)(w >> 24); -#endif -} - -static BLAKE2_INLINE void store64( void *dst, uint64_t w ) -{ -#if defined(NATIVE_LITTLE_ENDIAN) - memcpy(dst, &w, sizeof w); -#else - uint8_t *p = ( uint8_t * )dst; - p[0] = (uint8_t)(w >> 0); - p[1] = (uint8_t)(w >> 8); - p[2] = (uint8_t)(w >> 16); - p[3] = (uint8_t)(w >> 24); - p[4] = (uint8_t)(w >> 32); - p[5] = (uint8_t)(w >> 40); - p[6] = (uint8_t)(w >> 48); - p[7] = (uint8_t)(w >> 56); -#endif -} - -static BLAKE2_INLINE uint64_t load48( const void *src ) -{ - const uint8_t *p = ( const uint8_t * )src; - return (( uint64_t )( p[0] ) << 0) | - (( uint64_t )( p[1] ) << 8) | - (( uint64_t )( p[2] ) << 16) | - (( uint64_t )( p[3] ) << 24) | - (( uint64_t )( p[4] ) << 32) | - (( uint64_t )( p[5] ) << 40) ; -} - -static BLAKE2_INLINE void store48( void *dst, uint64_t w ) -{ - uint8_t *p = ( uint8_t * )dst; - p[0] = (uint8_t)(w >> 0); - p[1] = (uint8_t)(w >> 8); - p[2] = (uint8_t)(w >> 16); - p[3] = (uint8_t)(w >> 24); - p[4] = (uint8_t)(w >> 32); - p[5] = (uint8_t)(w >> 40); -} - -static BLAKE2_INLINE uint32_t rotr32( const uint32_t w, const unsigned c ) -{ - return ( w >> c ) | ( w << ( 32 - c ) ); -} - -static BLAKE2_INLINE uint64_t rotr64( const uint64_t w, const unsigned c ) -{ - return ( w >> c ) | ( w << ( 64 - c ) ); -} - -/* prevents compiler optimizing out memset() */ -static BLAKE2_INLINE void secure_zero_memory(void *v, size_t n) -{ - static void *(*const volatile memset_v)(void *, int, size_t) = &memset; - memset_v(v, 0, n); -} - -#endif diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/blake2.h b/vendor/github.com/ubiq/ubqhash/src/libubqhash/blake2.h deleted file mode 100644 index d83218756f..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/blake2.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ -#ifndef BLAKE2_H -#define BLAKE2_H - -#include -#include - -#if defined(_MSC_VER) -#define BLAKE2_PACKED(x) __pragma(pack(push, 1)) x __pragma(pack(pop)) -#else -#define BLAKE2_PACKED(x) x __attribute__((packed)) -#endif - -#if defined(__cplusplus) -extern "C" { -#endif - -struct ubqhash_h256; - - enum blake2s_constant - { - BLAKE2S_BLOCKBYTES = 64, - BLAKE2S_OUTBYTES = 32, - BLAKE2S_KEYBYTES = 32, - BLAKE2S_SALTBYTES = 8, - BLAKE2S_PERSONALBYTES = 8 - }; - - enum blake2b_constant - { - BLAKE2B_BLOCKBYTES = 128, - BLAKE2B_OUTBYTES = 64, - BLAKE2B_KEYBYTES = 64, - BLAKE2B_SALTBYTES = 16, - BLAKE2B_PERSONALBYTES = 16 - }; - - typedef struct blake2s_state__ - { - uint32_t h[8]; - uint32_t t[2]; - uint32_t f[2]; - uint8_t buf[BLAKE2S_BLOCKBYTES]; - size_t buflen; - size_t outlen; - uint8_t last_node; - } blake2s_state; - - typedef struct blake2b_state__ - { - uint64_t h[8]; - uint64_t t[2]; - uint64_t f[2]; - uint8_t buf[BLAKE2B_BLOCKBYTES]; - size_t buflen; - size_t outlen; - uint8_t last_node; - } blake2b_state; - - typedef struct blake2sp_state__ - { - blake2s_state S[8][1]; - blake2s_state R[1]; - uint8_t buf[8 * BLAKE2S_BLOCKBYTES]; - size_t buflen; - size_t outlen; - } blake2sp_state; - - typedef struct blake2bp_state__ - { - blake2b_state S[4][1]; - blake2b_state R[1]; - uint8_t buf[4 * BLAKE2B_BLOCKBYTES]; - size_t buflen; - size_t outlen; - } blake2bp_state; - - - BLAKE2_PACKED(struct blake2s_param__ - { - uint8_t digest_length; /* 1 */ - uint8_t key_length; /* 2 */ - uint8_t fanout; /* 3 */ - uint8_t depth; /* 4 */ - uint32_t leaf_length; /* 8 */ - uint32_t node_offset; /* 12 */ - uint16_t xof_length; /* 14 */ - uint8_t node_depth; /* 15 */ - uint8_t inner_length; /* 16 */ - /* uint8_t reserved[0]; */ - uint8_t salt[BLAKE2S_SALTBYTES]; /* 24 */ - uint8_t personal[BLAKE2S_PERSONALBYTES]; /* 32 */ - }); - - typedef struct blake2s_param__ blake2s_param; - - BLAKE2_PACKED(struct blake2b_param__ - { - uint8_t digest_length; /* 1 */ - uint8_t key_length; /* 2 */ - uint8_t fanout; /* 3 */ - uint8_t depth; /* 4 */ - uint32_t leaf_length; /* 8 */ - uint32_t node_offset; /* 12 */ - uint32_t xof_length; /* 16 */ - uint8_t node_depth; /* 17 */ - uint8_t inner_length; /* 18 */ - uint8_t reserved[14]; /* 32 */ - uint8_t salt[BLAKE2B_SALTBYTES]; /* 48 */ - uint8_t personal[BLAKE2B_PERSONALBYTES]; /* 64 */ - }); - - typedef struct blake2b_param__ blake2b_param; - - typedef struct blake2xs_state__ - { - blake2s_state S[1]; - blake2s_param P[1]; - } blake2xs_state; - - typedef struct blake2xb_state__ - { - blake2b_state S[1]; - blake2b_param P[1]; - } blake2xb_state; - - /* Padded structs result in a compile-time error */ - enum { - BLAKE2_DUMMY_1 = 1/(sizeof(blake2s_param) == BLAKE2S_OUTBYTES), - BLAKE2_DUMMY_2 = 1/(sizeof(blake2b_param) == BLAKE2B_OUTBYTES) - }; - - /* Streaming API */ - int blake2b_init( blake2b_state *S, size_t outlen ); - int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ); - int blake2b_init_param( blake2b_state *S, const blake2b_param *P ); - int blake2b_update( blake2b_state *S, const void *in, size_t inlen ); - int blake2b_final( blake2b_state *S, void *out, size_t outlen ); - - /* Simple API */ - int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - - /* This is simply an alias for blake2b */ - int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - - static inline void BLAKE2B_512(uint8_t* ret, uint8_t const* data, size_t const size) - { - blake2b(ret, 64, data, size, 0, 0 ); - } - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/blake2_cryptopp.cpp b/vendor/github.com/ubiq/ubqhash/src/libubqhash/blake2_cryptopp.cpp deleted file mode 100644 index 13a1e35034..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/blake2_cryptopp.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/* - This file is part of ubqhash. - - ubqhash 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. - - ubqhash 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 ubqhash. If not, see . -*/ - -/** @file sha3.cpp -* @author Tim Hughes -* @date 2015 -*/ -#include -#include - -extern "C" { -struct ubqhash_h256; -typedef struct ubqhash_h256 ubqhash_h256_t; -void BLAKE2B_512(uint8_t* const ret, uint8_t const* data, size_t size) -{ - CryptoPP::BLAKE2b().CalculateDigest(ret, data, size); -} -} diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/blake2_cryptopp.h b/vendor/github.com/ubiq/ubqhash/src/libubqhash/blake2_cryptopp.h deleted file mode 100644 index bc06d1274a..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/blake2_cryptopp.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include "compiler.h" -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct ubqhash_h256; - -void BLAKE2B_512(uint8_t* const ret, uint8_t const* data, size_t size); - -#ifdef __cplusplus -} -#endif diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/blake2b-ref.c b/vendor/github.com/ubiq/ubqhash/src/libubqhash/blake2b-ref.c deleted file mode 100644 index cd38b1ba00..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/blake2b-ref.c +++ /dev/null @@ -1,379 +0,0 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ - -#include -#include -#include - -#include "blake2.h" -#include "blake2-impl.h" - -static const uint64_t blake2b_IV[8] = -{ - 0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, - 0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL, - 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, - 0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL -}; - -static const uint8_t blake2b_sigma[12][16] = -{ - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , - { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } , - { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 } , - { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 } , - { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 } , - { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 } , - { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 } , - { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 } , - { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 } , - { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 } , - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , - { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } -}; - - -static void blake2b_set_lastnode( blake2b_state *S ) -{ - S->f[1] = (uint64_t)-1; -} - -/* Some helper functions, not necessarily useful */ -static int blake2b_is_lastblock( const blake2b_state *S ) -{ - return S->f[0] != 0; -} - -static void blake2b_set_lastblock( blake2b_state *S ) -{ - if( S->last_node ) blake2b_set_lastnode( S ); - - S->f[0] = (uint64_t)-1; -} - -static void blake2b_increment_counter( blake2b_state *S, const uint64_t inc ) -{ - S->t[0] += inc; - S->t[1] += ( S->t[0] < inc ); -} - -static void blake2b_init0( blake2b_state *S ) -{ - size_t i; - memset( S, 0, sizeof( blake2b_state ) ); - - for( i = 0; i < 8; ++i ) S->h[i] = blake2b_IV[i]; -} - -/* init xors IV with input parameter block */ -int blake2b_init_param( blake2b_state *S, const blake2b_param *P ) -{ - const uint8_t *p = ( const uint8_t * )( P ); - size_t i; - - blake2b_init0( S ); - - /* IV XOR ParamBlock */ - for( i = 0; i < 8; ++i ) - S->h[i] ^= load64( p + sizeof( S->h[i] ) * i ); - - S->outlen = P->digest_length; - return 0; -} - - - -int blake2b_init( blake2b_state *S, size_t outlen ) -{ - blake2b_param P[1]; - - if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; - - P->digest_length = (uint8_t)outlen; - P->key_length = 0; - P->fanout = 1; - P->depth = 1; - store32( &P->leaf_length, 0 ); - store32( &P->node_offset, 0 ); - store32( &P->xof_length, 0 ); - P->node_depth = 0; - P->inner_length = 0; - memset( P->reserved, 0, sizeof( P->reserved ) ); - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - return blake2b_init_param( S, P ); -} - - -int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ) -{ - blake2b_param P[1]; - - if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; - - if ( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) return -1; - - P->digest_length = (uint8_t)outlen; - P->key_length = (uint8_t)keylen; - P->fanout = 1; - P->depth = 1; - store32( &P->leaf_length, 0 ); - store32( &P->node_offset, 0 ); - store32( &P->xof_length, 0 ); - P->node_depth = 0; - P->inner_length = 0; - memset( P->reserved, 0, sizeof( P->reserved ) ); - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - - if( blake2b_init_param( S, P ) < 0 ) return -1; - - { - uint8_t block[BLAKE2B_BLOCKBYTES]; - memset( block, 0, BLAKE2B_BLOCKBYTES ); - memcpy( block, key, keylen ); - blake2b_update( S, block, BLAKE2B_BLOCKBYTES ); - secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ - } - return 0; -} - -#define G(r,i,a,b,c,d) \ - do { \ - a = a + b + m[blake2b_sigma[r][2*i+0]]; \ - d = rotr64(d ^ a, 32); \ - c = c + d; \ - b = rotr64(b ^ c, 24); \ - a = a + b + m[blake2b_sigma[r][2*i+1]]; \ - d = rotr64(d ^ a, 16); \ - c = c + d; \ - b = rotr64(b ^ c, 63); \ - } while(0) - -#define ROUND(r) \ - do { \ - G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \ - G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \ - G(r,2,v[ 2],v[ 6],v[10],v[14]); \ - G(r,3,v[ 3],v[ 7],v[11],v[15]); \ - G(r,4,v[ 0],v[ 5],v[10],v[15]); \ - G(r,5,v[ 1],v[ 6],v[11],v[12]); \ - G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \ - G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \ - } while(0) - -static void blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] ) -{ - uint64_t m[16]; - uint64_t v[16]; - size_t i; - - for( i = 0; i < 16; ++i ) { - m[i] = load64( block + i * sizeof( m[i] ) ); - } - - for( i = 0; i < 8; ++i ) { - v[i] = S->h[i]; - } - - v[ 8] = blake2b_IV[0]; - v[ 9] = blake2b_IV[1]; - v[10] = blake2b_IV[2]; - v[11] = blake2b_IV[3]; - v[12] = blake2b_IV[4] ^ S->t[0]; - v[13] = blake2b_IV[5] ^ S->t[1]; - v[14] = blake2b_IV[6] ^ S->f[0]; - v[15] = blake2b_IV[7] ^ S->f[1]; - - ROUND( 0 ); - ROUND( 1 ); - ROUND( 2 ); - ROUND( 3 ); - ROUND( 4 ); - ROUND( 5 ); - ROUND( 6 ); - ROUND( 7 ); - ROUND( 8 ); - ROUND( 9 ); - ROUND( 10 ); - ROUND( 11 ); - - for( i = 0; i < 8; ++i ) { - S->h[i] = S->h[i] ^ v[i] ^ v[i + 8]; - } -} - -#undef G -#undef ROUND - -int blake2b_update( blake2b_state *S, const void *pin, size_t inlen ) -{ - const unsigned char * in = (const unsigned char *)pin; - if( inlen > 0 ) - { - size_t left = S->buflen; - size_t fill = BLAKE2B_BLOCKBYTES - left; - if( inlen > fill ) - { - S->buflen = 0; - memcpy( S->buf + left, in, fill ); /* Fill buffer */ - blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); - blake2b_compress( S, S->buf ); /* Compress */ - in += fill; inlen -= fill; - while(inlen > BLAKE2B_BLOCKBYTES) { - blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES); - blake2b_compress( S, in ); - in += BLAKE2B_BLOCKBYTES; - inlen -= BLAKE2B_BLOCKBYTES; - } - } - memcpy( S->buf + S->buflen, in, inlen ); - S->buflen += inlen; - } - return 0; -} - -int blake2b_final( blake2b_state *S, void *out, size_t outlen ) -{ - uint8_t buffer[BLAKE2B_OUTBYTES] = {0}; - size_t i; - - if( out == NULL || outlen < S->outlen ) - return -1; - - if( blake2b_is_lastblock( S ) ) - return -1; - - blake2b_increment_counter( S, S->buflen ); - blake2b_set_lastblock( S ); - memset( S->buf + S->buflen, 0, BLAKE2B_BLOCKBYTES - S->buflen ); /* Padding */ - blake2b_compress( S, S->buf ); - - for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */ - store64( buffer + sizeof( S->h[i] ) * i, S->h[i] ); - - memcpy( out, buffer, S->outlen ); - secure_zero_memory(buffer, sizeof(buffer)); - return 0; -} - -/* inlen, at least, should be uint64_t. Others can be size_t. */ -int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) -{ - blake2b_state S[1]; - - /* Verify parameters */ - if ( NULL == in && inlen > 0 ) return -1; - - if ( NULL == out ) return -1; - - if( NULL == key && keylen > 0 ) return -1; - - if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; - - if( keylen > BLAKE2B_KEYBYTES ) return -1; - - if( keylen > 0 ) - { - if( blake2b_init_key( S, outlen, key, keylen ) < 0 ) return -1; - } - else - { - if( blake2b_init( S, outlen ) < 0 ) return -1; - } - - blake2b_update( S, ( const uint8_t * )in, inlen ); - blake2b_final( S, out, outlen ); - return 0; -} - -int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) { - return blake2b(out, outlen, in, inlen, key, keylen); -} - -#if defined(SUPERCOP) -int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen ) -{ - return blake2b( out, BLAKE2B_OUTBYTES, in, inlen, NULL, 0 ); -} -#endif - -#if defined(BLAKE2B_SELFTEST) -#include -#include "blake2-kat.h" -int main( void ) -{ - uint8_t key[BLAKE2B_KEYBYTES]; - uint8_t buf[BLAKE2_KAT_LENGTH]; - size_t i, step; - - for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) - key[i] = ( uint8_t )i; - - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - buf[i] = ( uint8_t )i; - - /* Test simple API */ - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - { - uint8_t hash[BLAKE2B_OUTBYTES]; - blake2b( hash, BLAKE2B_OUTBYTES, buf, i, key, BLAKE2B_KEYBYTES ); - - if( 0 != memcmp( hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES ) ) - { - goto fail; - } - } - - /* Test streaming API */ - for(step = 1; step < BLAKE2B_BLOCKBYTES; ++step) { - for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { - uint8_t hash[BLAKE2B_OUTBYTES]; - blake2b_state S; - uint8_t * p = buf; - size_t mlen = i; - int err = 0; - - if( (err = blake2b_init_key(&S, BLAKE2B_OUTBYTES, key, BLAKE2B_KEYBYTES)) < 0 ) { - goto fail; - } - - while (mlen >= step) { - if ( (err = blake2b_update(&S, p, step)) < 0 ) { - goto fail; - } - mlen -= step; - p += step; - } - if ( (err = blake2b_update(&S, p, mlen)) < 0) { - goto fail; - } - if ( (err = blake2b_final(&S, hash, BLAKE2B_OUTBYTES)) < 0) { - goto fail; - } - - if (0 != memcmp(hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES)) { - goto fail; - } - } - } - - puts( "ok" ); - return 0; -fail: - puts("error"); - return -1; -} -#endif diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/compiler.h b/vendor/github.com/ubiq/ubqhash/src/libubqhash/compiler.h deleted file mode 100644 index 9695871cdc..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/compiler.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-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. - - cpp-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 cpp-ethereum. If not, see . -*/ -/** @file compiler.h - * @date 2014 - */ -#pragma once - -// Visual Studio doesn't support the inline keyword in C mode -#if defined(_MSC_VER) && !defined(__cplusplus) -#define inline __inline -#endif - -// pretend restrict is a standard keyword -#if defined(_MSC_VER) -#define restrict __restrict -#else -#define restrict __restrict__ -#endif - diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/data_sizes.h b/vendor/github.com/ubiq/ubqhash/src/libubqhash/data_sizes.h deleted file mode 100644 index 83cc30bcba..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/data_sizes.h +++ /dev/null @@ -1,812 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-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 FoundationUUU,either version 3 of the LicenseUUU,or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be usefulU, - 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 cpp-ethereum. If notUUU,see . -*/ - -/** @file data_sizes.h -* @author Matthew Wampler-Doty -* @date 2015 -*/ - -#pragma once - -#include -#include "compiler.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -// 2048 Epochs (~20 years) worth of tabulated DAG sizes - -// Generated with the following Mathematica Code: - -// GetCacheSizes[n_] := Module[{ -// CacheSizeBytesInit = 2^24, -// CacheGrowth = 2^17, -// HashBytes = 64, -// j = 0}, -// Reap[ -// While[j < n, -// Module[{i = -// Floor[(CacheSizeBytesInit + CacheGrowth * j) / HashBytes]}, -// While[! PrimeQ[i], i--]; -// Sow[i*HashBytes]; j++]]]][[2]][[1]] - - -static const uint64_t dag_sizes[2048] = { - 1073739904U, 1082130304U, 1090514816U, 1098906752U, 1107293056U, - 1115684224U, 1124070016U, 1132461952U, 1140849536U, 1149232768U, - 1157627776U, 1166013824U, 1174404736U, 1182786944U, 1191180416U, - 1199568512U, 1207958912U, 1216345216U, 1224732032U, 1233124736U, - 1241513344U, 1249902464U, 1258290304U, 1266673792U, 1275067264U, - 1283453312U, 1291844992U, 1300234112U, 1308619904U, 1317010048U, - 1325397376U, 1333787776U, 1342176128U, 1350561664U, 1358954368U, - 1367339392U, 1375731584U, 1384118144U, 1392507008U, 1400897408U, - 1409284736U, 1417673344U, 1426062464U, 1434451072U, 1442839168U, - 1451229056U, 1459615616U, 1468006016U, 1476394112U, 1484782976U, - 1493171584U, 1501559168U, 1509948032U, 1518337664U, 1526726528U, - 1535114624U, 1543503488U, 1551892096U, 1560278656U, 1568669056U, - 1577056384U, 1585446272U, 1593831296U, 1602219392U, 1610610304U, - 1619000192U, 1627386752U, 1635773824U, 1644164224U, 1652555648U, - 1660943488U, 1669332608U, 1677721216U, 1686109312U, 1694497664U, - 1702886272U, 1711274624U, 1719661184U, 1728047744U, 1736434816U, - 1744829056U, 1753218944U, 1761606272U, 1769995904U, 1778382464U, - 1786772864U, 1795157888U, 1803550592U, 1811937664U, 1820327552U, - 1828711552U, 1837102976U, 1845488768U, 1853879936U, 1862269312U, - 1870656896U, 1879048064U, 1887431552U, 1895825024U, 1904212096U, - 1912601216U, 1920988544U, 1929379456U, 1937765504U, 1946156672U, - 1954543232U, 1962932096U, 1971321728U, 1979707264U, 1988093056U, - 1996487552U, 2004874624U, 2013262208U, 2021653888U, 2030039936U, - 2038430848U, 2046819968U, 2055208576U, 2063596672U, 2071981952U, - 2080373632U, 2088762752U, 2097149056U, 2105539712U, 2113928576U, - 2122315136U, 2130700672U, 2139092608U, 2147483264U, 2155872128U, - 2164257664U, 2172642176U, 2181035392U, 2189426048U, 2197814912U, - 2206203008U, 2214587264U, 2222979712U, 2231367808U, 2239758208U, - 2248145024U, 2256527744U, 2264922752U, 2273312128U, 2281701248U, - 2290086272U, 2298476672U, 2306867072U, 2315251072U, 2323639168U, - 2332032128U, 2340420224U, 2348808064U, 2357196416U, 2365580416U, - 2373966976U, 2382363008U, 2390748544U, 2399139968U, 2407530368U, - 2415918976U, 2424307328U, 2432695424U, 2441084288U, 2449472384U, - 2457861248U, 2466247808U, 2474637184U, 2483026816U, 2491414144U, - 2499803776U, 2508191872U, 2516582272U, 2524970368U, 2533359232U, - 2541743488U, 2550134144U, 2558525056U, 2566913408U, 2575301504U, - 2583686528U, 2592073856U, 2600467328U, 2608856192U, 2617240448U, - 2625631616U, 2634022016U, 2642407552U, 2650796416U, 2659188352U, - 2667574912U, 2675965312U, 2684352896U, 2692738688U, 2701130624U, - 2709518464U, 2717907328U, 2726293376U, 2734685056U, 2743073152U, - 2751462016U, 2759851648U, 2768232832U, 2776625536U, 2785017728U, - 2793401984U, 2801794432U, 2810182016U, 2818571648U, 2826959488U, - 2835349376U, 2843734144U, 2852121472U, 2860514432U, 2868900992U, - 2877286784U, 2885676928U, 2894069632U, 2902451584U, 2910843008U, - 2919234688U, 2927622784U, 2936011648U, 2944400768U, 2952789376U, - 2961177728U, 2969565568U, 2977951616U, 2986338944U, 2994731392U, - 3003120256U, 3011508352U, 3019895936U, 3028287104U, 3036675968U, - 3045063808U, 3053452928U, 3061837696U, 3070228352U, 3078615424U, - 3087003776U, 3095394944U, 3103782272U, 3112173184U, 3120562048U, - 3128944768U, 3137339264U, 3145725056U, 3154109312U, 3162505088U, - 3170893184U, 3179280256U, 3187669376U, 3196056704U, 3204445568U, - 3212836736U, 3221224064U, 3229612928U, 3238002304U, 3246391168U, - 3254778496U, 3263165824U, 3271556224U, 3279944576U, 3288332416U, - 3296719232U, 3305110912U, 3313500032U, 3321887104U, 3330273152U, - 3338658944U, 3347053184U, 3355440512U, 3363827072U, 3372220288U, - 3380608384U, 3388997504U, 3397384576U, 3405774208U, 3414163072U, - 3422551936U, 3430937984U, 3439328384U, 3447714176U, 3456104576U, - 3464493952U, 3472883584U, 3481268864U, 3489655168U, 3498048896U, - 3506434432U, 3514826368U, 3523213952U, 3531603584U, 3539987072U, - 3548380288U, 3556763264U, 3565157248U, 3573545344U, 3581934464U, - 3590324096U, 3598712704U, 3607098752U, 3615488384U, 3623877248U, - 3632265856U, 3640646528U, 3649043584U, 3657430144U, 3665821568U, - 3674207872U, 3682597504U, 3690984832U, 3699367808U, 3707764352U, - 3716152448U, 3724541056U, 3732925568U, 3741318016U, 3749706368U, - 3758091136U, 3766481536U, 3774872704U, 3783260032U, 3791650432U, - 3800036224U, 3808427648U, 3816815488U, 3825204608U, 3833592704U, - 3841981568U, 3850370432U, 3858755968U, 3867147904U, 3875536256U, - 3883920512U, 3892313728U, 3900702592U, 3909087872U, 3917478784U, - 3925868416U, 3934256512U, 3942645376U, 3951032192U, 3959422336U, - 3967809152U, 3976200064U, 3984588416U, 3992974976U, 4001363584U, - 4009751168U, 4018141312U, 4026530432U, 4034911616U, 4043308928U, - 4051695488U, 4060084352U, 4068472448U, 4076862848U, 4085249408U, - 4093640576U, 4102028416U, 4110413696U, 4118805632U, 4127194496U, - 4135583104U, 4143971968U, 4152360832U, 4160746112U, 4169135744U, - 4177525888U, 4185912704U, 4194303616U, 4202691968U, 4211076736U, - 4219463552U, 4227855488U, 4236246656U, 4244633728U, 4253022848U, - 4261412224U, 4269799808U, 4278184832U, 4286578048U, 4294962304U, - 4303349632U, 4311743104U, 4320130432U, 4328521088U, 4336909184U, - 4345295488U, 4353687424U, 4362073472U, 4370458496U, 4378852736U, - 4387238528U, 4395630208U, 4404019072U, 4412407424U, 4420790656U, - 4429182848U, 4437571456U, 4445962112U, 4454344064U, 4462738048U, - 4471119232U, 4479516544U, 4487904128U, 4496289664U, 4504682368U, - 4513068416U, 4521459584U, 4529846144U, 4538232704U, 4546619776U, - 4555010176U, 4563402112U, 4571790208U, 4580174464U, 4588567936U, - 4596957056U, 4605344896U, 4613734016U, 4622119808U, 4630511488U, - 4638898816U, 4647287936U, 4655675264U, 4664065664U, 4672451968U, - 4680842624U, 4689231488U, 4697620352U, 4706007424U, 4714397056U, - 4722786176U, 4731173248U, 4739562368U, 4747951744U, 4756340608U, - 4764727936U, 4773114496U, 4781504384U, 4789894784U, 4798283648U, - 4806667648U, 4815059584U, 4823449472U, 4831835776U, 4840226176U, - 4848612224U, 4857003392U, 4865391488U, 4873780096U, 4882169728U, - 4890557312U, 4898946944U, 4907333248U, 4915722368U, 4924110976U, - 4932499328U, 4940889728U, 4949276032U, 4957666432U, 4966054784U, - 4974438016U, 4982831488U, 4991221376U, 4999607168U, 5007998848U, - 5016386432U, 5024763776U, 5033164672U, 5041544576U, 5049941888U, - 5058329728U, 5066717056U, 5075107456U, 5083494272U, 5091883904U, - 5100273536U, 5108662144U, 5117048192U, 5125436032U, 5133827456U, - 5142215296U, 5150605184U, 5158993024U, 5167382144U, 5175769472U, - 5184157568U, 5192543872U, 5200936064U, 5209324928U, 5217711232U, - 5226102656U, 5234490496U, 5242877312U, 5251263872U, 5259654016U, - 5268040832U, 5276434304U, 5284819328U, 5293209728U, 5301598592U, - 5309986688U, 5318374784U, 5326764416U, 5335151488U, 5343542144U, - 5351929472U, 5360319872U, 5368706944U, 5377096576U, 5385484928U, - 5393871232U, 5402263424U, 5410650496U, 5419040384U, 5427426944U, - 5435816576U, 5444205952U, 5452594816U, 5460981376U, 5469367936U, - 5477760896U, 5486148736U, 5494536832U, 5502925952U, 5511315328U, - 5519703424U, 5528089984U, 5536481152U, 5544869504U, 5553256064U, - 5561645696U, 5570032768U, 5578423936U, 5586811264U, 5595193216U, - 5603585408U, 5611972736U, 5620366208U, 5628750464U, 5637143936U, - 5645528192U, 5653921408U, 5662310272U, 5670694784U, 5679082624U, - 5687474048U, 5695864448U, 5704251008U, 5712641408U, 5721030272U, - 5729416832U, 5737806208U, 5746194304U, 5754583936U, 5762969984U, - 5771358592U, 5779748224U, 5788137856U, 5796527488U, 5804911232U, - 5813300608U, 5821692544U, 5830082176U, 5838468992U, 5846855552U, - 5855247488U, 5863636096U, 5872024448U, 5880411008U, 5888799872U, - 5897186432U, 5905576832U, 5913966976U, 5922352768U, 5930744704U, - 5939132288U, 5947522432U, 5955911296U, 5964299392U, 5972688256U, - 5981074304U, 5989465472U, 5997851008U, 6006241408U, 6014627968U, - 6023015552U, 6031408256U, 6039796096U, 6048185216U, 6056574848U, - 6064963456U, 6073351808U, 6081736064U, 6090128768U, 6098517632U, - 6106906496U, 6115289216U, 6123680896U, 6132070016U, 6140459648U, - 6148849024U, 6157237376U, 6165624704U, 6174009728U, 6182403712U, - 6190792064U, 6199176064U, 6207569792U, 6215952256U, 6224345216U, - 6232732544U, 6241124224U, 6249510272U, 6257899136U, 6266287744U, - 6274676864U, 6283065728U, 6291454336U, 6299843456U, 6308232064U, - 6316620928U, 6325006208U, 6333395584U, 6341784704U, 6350174848U, - 6358562176U, 6366951296U, 6375337856U, 6383729536U, 6392119168U, - 6400504192U, 6408895616U, 6417283456U, 6425673344U, 6434059136U, - 6442444672U, 6450837376U, 6459223424U, 6467613056U, 6476004224U, - 6484393088U, 6492781952U, 6501170048U, 6509555072U, 6517947008U, - 6526336384U, 6534725504U, 6543112832U, 6551500672U, 6559888768U, - 6568278656U, 6576662912U, 6585055616U, 6593443456U, 6601834112U, - 6610219648U, 6618610304U, 6626999168U, 6635385472U, 6643777408U, - 6652164224U, 6660552832U, 6668941952U, 6677330048U, 6685719424U, - 6694107776U, 6702493568U, 6710882176U, 6719274112U, 6727662976U, - 6736052096U, 6744437632U, 6752825984U, 6761213824U, 6769604224U, - 6777993856U, 6786383488U, 6794770816U, 6803158144U, 6811549312U, - 6819937664U, 6828326528U, 6836706176U, 6845101696U, 6853491328U, - 6861880448U, 6870269312U, 6878655104U, 6887046272U, 6895433344U, - 6903822208U, 6912212864U, 6920596864U, 6928988288U, 6937377152U, - 6945764992U, 6954149248U, 6962544256U, 6970928768U, 6979317376U, - 6987709312U, 6996093824U, 7004487296U, 7012875392U, 7021258624U, - 7029652352U, 7038038912U, 7046427776U, 7054818944U, 7063207808U, - 7071595136U, 7079980928U, 7088372608U, 7096759424U, 7105149824U, - 7113536896U, 7121928064U, 7130315392U, 7138699648U, 7147092352U, - 7155479168U, 7163865728U, 7172249984U, 7180648064U, 7189036672U, - 7197424768U, 7205810816U, 7214196608U, 7222589824U, 7230975104U, - 7239367552U, 7247755904U, 7256145536U, 7264533376U, 7272921472U, - 7281308032U, 7289694848U, 7298088832U, 7306471808U, 7314864512U, - 7323253888U, 7331643008U, 7340029568U, 7348419712U, 7356808832U, - 7365196672U, 7373585792U, 7381973888U, 7390362752U, 7398750592U, - 7407138944U, 7415528576U, 7423915648U, 7432302208U, 7440690304U, - 7449080192U, 7457472128U, 7465860992U, 7474249088U, 7482635648U, - 7491023744U, 7499412608U, 7507803008U, 7516192384U, 7524579968U, - 7532967296U, 7541358464U, 7549745792U, 7558134656U, 7566524032U, - 7574912896U, 7583300992U, 7591690112U, 7600075136U, 7608466816U, - 7616854912U, 7625244544U, 7633629824U, 7642020992U, 7650410368U, - 7658794112U, 7667187328U, 7675574912U, 7683961984U, 7692349568U, - 7700739712U, 7709130368U, 7717519232U, 7725905536U, 7734295424U, - 7742683264U, 7751069056U, 7759457408U, 7767849088U, 7776238208U, - 7784626816U, 7793014912U, 7801405312U, 7809792128U, 7818179968U, - 7826571136U, 7834957184U, 7843347328U, 7851732352U, 7860124544U, - 7868512384U, 7876902016U, 7885287808U, 7893679744U, 7902067072U, - 7910455936U, 7918844288U, 7927230848U, 7935622784U, 7944009344U, - 7952400256U, 7960786048U, 7969176704U, 7977565312U, 7985953408U, - 7994339968U, 8002730368U, 8011119488U, 8019508096U, 8027896192U, - 8036285056U, 8044674688U, 8053062272U, 8061448832U, 8069838464U, - 8078227328U, 8086616704U, 8095006592U, 8103393664U, 8111783552U, - 8120171392U, 8128560256U, 8136949376U, 8145336704U, 8153726848U, - 8162114944U, 8170503296U, 8178891904U, 8187280768U, 8195669632U, - 8204058496U, 8212444544U, 8220834176U, 8229222272U, 8237612672U, - 8246000768U, 8254389376U, 8262775168U, 8271167104U, 8279553664U, - 8287944064U, 8296333184U, 8304715136U, 8313108352U, 8321497984U, - 8329885568U, 8338274432U, 8346663296U, 8355052928U, 8363441536U, - 8371828352U, 8380217984U, 8388606592U, 8396996224U, 8405384576U, - 8413772672U, 8422161536U, 8430549376U, 8438939008U, 8447326592U, - 8455715456U, 8464104832U, 8472492928U, 8480882048U, 8489270656U, - 8497659776U, 8506045312U, 8514434944U, 8522823808U, 8531208832U, - 8539602304U, 8547990656U, 8556378752U, 8564768384U, 8573154176U, - 8581542784U, 8589933952U, 8598322816U, 8606705024U, 8615099264U, - 8623487872U, 8631876992U, 8640264064U, 8648653952U, 8657040256U, - 8665430656U, 8673820544U, 8682209152U, 8690592128U, 8698977152U, - 8707374464U, 8715763328U, 8724151424U, 8732540032U, 8740928384U, - 8749315712U, 8757704576U, 8766089344U, 8774480768U, 8782871936U, - 8791260032U, 8799645824U, 8808034432U, 8816426368U, 8824812928U, - 8833199488U, 8841591424U, 8849976448U, 8858366336U, 8866757248U, - 8875147136U, 8883532928U, 8891923328U, 8900306816U, 8908700288U, - 8917088384U, 8925478784U, 8933867392U, 8942250368U, 8950644608U, - 8959032704U, 8967420544U, 8975809664U, 8984197504U, 8992584064U, - 9000976256U, 9009362048U, 9017752448U, 9026141312U, 9034530688U, - 9042917504U, 9051307904U, 9059694208U, 9068084864U, 9076471424U, - 9084861824U, 9093250688U, 9101638528U, 9110027648U, 9118416512U, - 9126803584U, 9135188096U, 9143581312U, 9151969664U, 9160356224U, - 9168747136U, 9177134464U, 9185525632U, 9193910144U, 9202302848U, - 9210690688U, 9219079552U, 9227465344U, 9235854464U, 9244244864U, - 9252633472U, 9261021824U, 9269411456U, 9277799296U, 9286188928U, - 9294574208U, 9302965888U, 9311351936U, 9319740032U, 9328131968U, - 9336516736U, 9344907392U, 9353296768U, 9361685888U, 9370074752U, - 9378463616U, 9386849408U, 9395239808U, 9403629184U, 9412016512U, - 9420405376U, 9428795008U, 9437181568U, 9445570688U, 9453960832U, - 9462346624U, 9470738048U, 9479121536U, 9487515008U, 9495903616U, - 9504289664U, 9512678528U, 9521067904U, 9529456256U, 9537843584U, - 9546233728U, 9554621312U, 9563011456U, 9571398784U, 9579788672U, - 9588178304U, 9596567168U, 9604954496U, 9613343104U, 9621732992U, - 9630121856U, 9638508416U, 9646898816U, 9655283584U, 9663675776U, - 9672061312U, 9680449664U, 9688840064U, 9697230464U, 9705617536U, - 9714003584U, 9722393984U, 9730772608U, 9739172224U, 9747561088U, - 9755945344U, 9764338816U, 9772726144U, 9781116544U, 9789503872U, - 9797892992U, 9806282624U, 9814670464U, 9823056512U, 9831439232U, - 9839833984U, 9848224384U, 9856613504U, 9865000576U, 9873391232U, - 9881772416U, 9890162816U, 9898556288U, 9906940544U, 9915333248U, - 9923721088U, 9932108672U, 9940496512U, 9948888448U, 9957276544U, - 9965666176U, 9974048384U, 9982441088U, 9990830464U, 9999219584U, - 10007602816U, 10015996544U, 10024385152U, 10032774016U, 10041163648U, - 10049548928U, 10057940096U, 10066329472U, 10074717824U, 10083105152U, - 10091495296U, 10099878784U, 10108272256U, 10116660608U, 10125049216U, - 10133437312U, 10141825664U, 10150213504U, 10158601088U, 10166991232U, - 10175378816U, 10183766144U, 10192157312U, 10200545408U, 10208935552U, - 10217322112U, 10225712768U, 10234099328U, 10242489472U, 10250876032U, - 10259264896U, 10267656064U, 10276042624U, 10284429184U, 10292820352U, - 10301209472U, 10309598848U, 10317987712U, 10326375296U, 10334763392U, - 10343153536U, 10351541632U, 10359930752U, 10368318592U, 10376707456U, - 10385096576U, 10393484672U, 10401867136U, 10410262144U, 10418647424U, - 10427039104U, 10435425664U, 10443810176U, 10452203648U, 10460589952U, - 10468982144U, 10477369472U, 10485759104U, 10494147712U, 10502533504U, - 10510923392U, 10519313536U, 10527702656U, 10536091264U, 10544478592U, - 10552867712U, 10561255808U, 10569642368U, 10578032768U, 10586423168U, - 10594805632U, 10603200128U, 10611588992U, 10619976064U, 10628361344U, - 10636754048U, 10645143424U, 10653531776U, 10661920384U, 10670307968U, - 10678696832U, 10687086464U, 10695475072U, 10703863168U, 10712246144U, - 10720639616U, 10729026688U, 10737414784U, 10745806208U, 10754190976U, - 10762581376U, 10770971264U, 10779356288U, 10787747456U, 10796135552U, - 10804525184U, 10812915584U, 10821301888U, 10829692288U, 10838078336U, - 10846469248U, 10854858368U, 10863247232U, 10871631488U, 10880023424U, - 10888412032U, 10896799616U, 10905188992U, 10913574016U, 10921964672U, - 10930352768U, 10938742912U, 10947132544U, 10955518592U, 10963909504U, - 10972298368U, 10980687488U, 10989074816U, 10997462912U, 11005851776U, - 11014241152U, 11022627712U, 11031017344U, 11039403904U, 11047793024U, - 11056184704U, 11064570752U, 11072960896U, 11081343872U, 11089737856U, - 11098128256U, 11106514816U, 11114904448U, 11123293568U, 11131680128U, - 11140065152U, 11148458368U, 11156845696U, 11165236864U, 11173624192U, - 11182013824U, 11190402688U, 11198790784U, 11207179136U, 11215568768U, - 11223957376U, 11232345728U, 11240734592U, 11249122688U, 11257511296U, - 11265899648U, 11274285952U, 11282675584U, 11291065472U, 11299452544U, - 11307842432U, 11316231296U, 11324616832U, 11333009024U, 11341395584U, - 11349782656U, 11358172288U, 11366560384U, 11374950016U, 11383339648U, - 11391721856U, 11400117376U, 11408504192U, 11416893568U, 11425283456U, - 11433671552U, 11442061184U, 11450444672U, 11458837888U, 11467226752U, - 11475611776U, 11484003968U, 11492392064U, 11500780672U, 11509169024U, - 11517550976U, 11525944448U, 11534335616U, 11542724224U, 11551111808U, - 11559500672U, 11567890304U, 11576277376U, 11584667008U, 11593056128U, - 11601443456U, 11609830016U, 11618221952U, 11626607488U, 11634995072U, - 11643387776U, 11651775104U, 11660161664U, 11668552576U, 11676940928U, - 11685330304U, 11693718656U, 11702106496U, 11710496128U, 11718882688U, - 11727273088U, 11735660416U, 11744050048U, 11752437376U, 11760824704U, - 11769216128U, 11777604736U, 11785991296U, 11794381952U, 11802770048U, - 11811157888U, 11819548544U, 11827932544U, 11836324736U, 11844713344U, - 11853100928U, 11861486464U, 11869879936U, 11878268032U, 11886656896U, - 11895044992U, 11903433088U, 11911822976U, 11920210816U, 11928600448U, - 11936987264U, 11945375872U, 11953761152U, 11962151296U, 11970543488U, - 11978928512U, 11987320448U, 11995708288U, 12004095104U, 12012486272U, - 12020875136U, 12029255552U, 12037652096U, 12046039168U, 12054429568U, - 12062813824U, 12071206528U, 12079594624U, 12087983744U, 12096371072U, - 12104759936U, 12113147264U, 12121534592U, 12129924992U, 12138314624U, - 12146703232U, 12155091584U, 12163481216U, 12171864704U, 12180255872U, - 12188643968U, 12197034112U, 12205424512U, 12213811328U, 12222199424U, - 12230590336U, 12238977664U, 12247365248U, 12255755392U, 12264143488U, - 12272531584U, 12280920448U, 12289309568U, 12297694592U, 12306086528U, - 12314475392U, 12322865024U, 12331253632U, 12339640448U, 12348029312U, - 12356418944U, 12364805248U, 12373196672U, 12381580928U, 12389969024U, - 12398357632U, 12406750592U, 12415138432U, 12423527552U, 12431916416U, - 12440304512U, 12448692352U, 12457081216U, 12465467776U, 12473859968U, - 12482245504U, 12490636672U, 12499025536U, 12507411584U, 12515801728U, - 12524190592U, 12532577152U, 12540966272U, 12549354368U, 12557743232U, - 12566129536U, 12574523264U, 12582911872U, 12591299456U, 12599688064U, - 12608074624U, 12616463488U, 12624845696U, 12633239936U, 12641631616U, - 12650019968U, 12658407296U, 12666795136U, 12675183232U, 12683574656U, - 12691960192U, 12700350592U, 12708740224U, 12717128576U, 12725515904U, - 12733906816U, 12742295168U, 12750680192U, 12759071872U, 12767460736U, - 12775848832U, 12784236928U, 12792626816U, 12801014656U, 12809404288U, - 12817789312U, 12826181504U, 12834568832U, 12842954624U, 12851345792U, - 12859732352U, 12868122496U, 12876512128U, 12884901248U, 12893289088U, - 12901672832U, 12910067584U, 12918455168U, 12926842496U, 12935232896U, - 12943620736U, 12952009856U, 12960396928U, 12968786816U, 12977176192U, - 12985563776U, 12993951104U, 13002341504U, 13010730368U, 13019115392U, - 13027506304U, 13035895168U, 13044272512U, 13052673152U, 13061062528U, - 13069446272U, 13077838976U, 13086227072U, 13094613632U, 13103000192U, - 13111393664U, 13119782528U, 13128157568U, 13136559232U, 13144945024U, - 13153329536U, 13161724288U, 13170111872U, 13178502784U, 13186884736U, - 13195279744U, 13203667072U, 13212057472U, 13220445824U, 13228832128U, - 13237221248U, 13245610624U, 13254000512U, 13262388352U, 13270777472U, - 13279166336U, 13287553408U, 13295943296U, 13304331904U, 13312719488U, - 13321108096U, 13329494656U, 13337885824U, 13346274944U, 13354663808U, - 13363051136U, 13371439232U, 13379825024U, 13388210816U, 13396605056U, - 13404995456U, 13413380224U, 13421771392U, 13430159744U, 13438546048U, - 13446937216U, 13455326848U, 13463708288U, 13472103808U, 13480492672U, - 13488875648U, 13497269888U, 13505657728U, 13514045312U, 13522435712U, - 13530824576U, 13539210112U, 13547599232U, 13555989376U, 13564379008U, - 13572766336U, 13581154432U, 13589544832U, 13597932928U, 13606320512U, - 13614710656U, 13623097472U, 13631477632U, 13639874944U, 13648264064U, - 13656652928U, 13665041792U, 13673430656U, 13681818496U, 13690207616U, - 13698595712U, 13706982272U, 13715373184U, 13723762048U, 13732150144U, - 13740536704U, 13748926592U, 13757316224U, 13765700992U, 13774090112U, - 13782477952U, 13790869376U, 13799259008U, 13807647872U, 13816036736U, - 13824425344U, 13832814208U, 13841202304U, 13849591424U, 13857978752U, - 13866368896U, 13874754688U, 13883145344U, 13891533184U, 13899919232U, - 13908311168U, 13916692096U, 13925085056U, 13933473152U, 13941866368U, - 13950253696U, 13958643584U, 13967032192U, 13975417216U, 13983807616U, - 13992197504U, 14000582272U, 14008973696U, 14017363072U, 14025752192U, - 14034137984U, 14042528384U, 14050918016U, 14059301504U, 14067691648U, - 14076083584U, 14084470144U, 14092852352U, 14101249664U, 14109635968U, - 14118024832U, 14126407552U, 14134804352U, 14143188608U, 14151577984U, - 14159968384U, 14168357248U, 14176741504U, 14185127296U, 14193521024U, - 14201911424U, 14210301824U, 14218685056U, 14227067264U, 14235467392U, - 14243855488U, 14252243072U, 14260630144U, 14269021568U, 14277409408U, - 14285799296U, 14294187904U, 14302571392U, 14310961792U, 14319353728U, - 14327738752U, 14336130944U, 14344518784U, 14352906368U, 14361296512U, - 14369685376U, 14378071424U, 14386462592U, 14394848128U, 14403230848U, - 14411627392U, 14420013952U, 14428402304U, 14436793472U, 14445181568U, - 14453569664U, 14461959808U, 14470347904U, 14478737024U, 14487122816U, - 14495511424U, 14503901824U, 14512291712U, 14520677504U, 14529064832U, - 14537456768U, 14545845632U, 14554234496U, 14562618496U, 14571011456U, - 14579398784U, 14587789184U, 14596172672U, 14604564608U, 14612953984U, - 14621341312U, 14629724288U, 14638120832U, 14646503296U, 14654897536U, - 14663284864U, 14671675264U, 14680061056U, 14688447616U, 14696835968U, - 14705228416U, 14713616768U, 14722003328U, 14730392192U, 14738784128U, - 14747172736U, 14755561088U, 14763947648U, 14772336512U, 14780725376U, - 14789110144U, 14797499776U, 14805892736U, 14814276992U, 14822670208U, - 14831056256U, 14839444352U, 14847836032U, 14856222848U, 14864612992U, - 14872997504U, 14881388672U, 14889775744U, 14898165376U, 14906553472U, - 14914944896U, 14923329664U, 14931721856U, 14940109696U, 14948497024U, - 14956887424U, 14965276544U, 14973663616U, 14982053248U, 14990439808U, - 14998830976U, 15007216768U, 15015605888U, 15023995264U, 15032385152U, - 15040768384U, 15049154944U, 15057549184U, 15065939072U, 15074328448U, - 15082715008U, 15091104128U, 15099493504U, 15107879296U, 15116269184U, - 15124659584U, 15133042304U, 15141431936U, 15149824384U, 15158214272U, - 15166602368U, 15174991232U, 15183378304U, 15191760512U, 15200154496U, - 15208542592U, 15216931712U, 15225323392U, 15233708416U, 15242098048U, - 15250489216U, 15258875264U, 15267265408U, 15275654528U, 15284043136U, - 15292431488U, 15300819584U, 15309208192U, 15317596544U, 15325986176U, - 15334374784U, 15342763648U, 15351151744U, 15359540608U, 15367929728U, - 15376318336U, 15384706432U, 15393092992U, 15401481856U, 15409869952U, - 15418258816U, 15426649984U, 15435037568U, 15443425664U, 15451815296U, - 15460203392U, 15468589184U, 15476979328U, 15485369216U, 15493755776U, - 15502146944U, 15510534272U, 15518924416U, 15527311232U, 15535699072U, - 15544089472U, 15552478336U, 15560866688U, 15569254528U, 15577642624U, - 15586031488U, 15594419072U, 15602809472U, 15611199104U, 15619586432U, - 15627975296U, 15636364928U, 15644753792U, 15653141888U, 15661529216U, - 15669918848U, 15678305152U, 15686696576U, 15695083136U, 15703474048U, - 15711861632U, 15720251264U, 15728636288U, 15737027456U, 15745417088U, - 15753804928U, 15762194048U, 15770582656U, 15778971008U, 15787358336U, - 15795747712U, 15804132224U, 15812523392U, 15820909696U, 15829300096U, - 15837691264U, 15846071936U, 15854466944U, 15862855808U, 15871244672U, - 15879634816U, 15888020608U, 15896409728U, 15904799104U, 15913185152U, - 15921577088U, 15929966464U, 15938354816U, 15946743424U, 15955129472U, - 15963519872U, 15971907968U, 15980296064U, 15988684928U, 15997073024U, - 16005460864U, 16013851264U, 16022241152U, 16030629248U, 16039012736U, - 16047406976U, 16055794816U, 16064181376U, 16072571264U, 16080957824U, - 16089346688U, 16097737856U, 16106125184U, 16114514816U, 16122904192U, - 16131292544U, 16139678848U, 16148066944U, 16156453504U, 16164839552U, - 16173236096U, 16181623424U, 16190012032U, 16198401152U, 16206790528U, - 16215177344U, 16223567744U, 16231956352U, 16240344704U, 16248731008U, - 16257117824U, 16265504384U, 16273898624U, 16282281856U, 16290668672U, - 16299064192U, 16307449216U, 16315842176U, 16324230016U, 16332613504U, - 16341006464U, 16349394304U, 16357783168U, 16366172288U, 16374561664U, - 16382951296U, 16391337856U, 16399726208U, 16408116352U, 16416505472U, - 16424892032U, 16433282176U, 16441668224U, 16450058624U, 16458448768U, - 16466836864U, 16475224448U, 16483613056U, 16492001408U, 16500391808U, - 16508779648U, 16517166976U, 16525555328U, 16533944192U, 16542330752U, - 16550719616U, 16559110528U, 16567497088U, 16575888512U, 16584274816U, - 16592665472U, 16601051008U, 16609442944U, 16617832064U, 16626218624U, - 16634607488U, 16642996096U, 16651385728U, 16659773824U, 16668163712U, - 16676552576U, 16684938112U, 16693328768U, 16701718144U, 16710095488U, - 16718492288U, 16726883968U, 16735272832U, 16743661184U, 16752049792U, - 16760436608U, 16768827008U, 16777214336U, 16785599104U, 16793992832U, - 16802381696U, 16810768768U, 16819151744U, 16827542656U, 16835934848U, - 16844323712U, 16852711552U, 16861101952U, 16869489536U, 16877876864U, - 16886265728U, 16894653056U, 16903044736U, 16911431296U, 16919821696U, - 16928207488U, 16936592768U, 16944987776U, 16953375616U, 16961763968U, - 16970152832U, 16978540928U, 16986929536U, 16995319168U, 17003704448U, - 17012096896U, 17020481152U, 17028870784U, 17037262208U, 17045649536U, - 17054039936U, 17062426496U, 17070814336U, 17079205504U, 17087592064U, - 17095978112U, 17104369024U, 17112759424U, 17121147776U, 17129536384U, - 17137926016U, 17146314368U, 17154700928U, 17163089792U, 17171480192U, - 17179864192U, 17188256896U, 17196644992U, 17205033856U, 17213423488U, - 17221811072U, 17230198912U, 17238588032U, 17246976896U, 17255360384U, - 17263754624U, 17272143232U, 17280530048U, 17288918912U, 17297309312U, - 17305696384U, 17314085504U, 17322475136U, 17330863744U, 17339252096U, - 17347640192U, 17356026496U, 17364413824U, 17372796544U, 17381190016U, - 17389583488U, 17397972608U, 17406360704U, 17414748544U, 17423135872U, - 17431527296U, 17439915904U, 17448303232U, 17456691584U, 17465081728U, - 17473468288U, 17481857408U, 17490247552U, 17498635904U, 17507022464U, - 17515409024U, 17523801728U, 17532189824U, 17540577664U, 17548966016U, - 17557353344U, 17565741184U, 17574131584U, 17582519168U, 17590907008U, - 17599296128U, 17607687808U, 17616076672U, 17624455808U, 17632852352U, - 17641238656U, 17649630848U, 17658018944U, 17666403968U, 17674794112U, - 17683178368U, 17691573376U, 17699962496U, 17708350592U, 17716739968U, - 17725126528U, 17733517184U, 17741898112U, 17750293888U, 17758673024U, - 17767070336U, 17775458432U, 17783848832U, 17792236928U, 17800625536U, - 17809012352U, 17817402752U, 17825785984U, 17834178944U, 17842563968U, - 17850955648U, 17859344512U, 17867732864U, 17876119424U, 17884511872U, - 17892900224U, 17901287296U, 17909677696U, 17918058112U, 17926451072U, - 17934843776U, 17943230848U, 17951609216U, 17960008576U, 17968397696U, - 17976784256U, 17985175424U, 17993564032U, 18001952128U, 18010339712U, - 18018728576U, 18027116672U, 18035503232U, 18043894144U, 18052283264U, - 18060672128U, 18069056384U, 18077449856U, 18085837184U, 18094225792U, - 18102613376U, 18111004544U, 18119388544U, 18127781248U, 18136170368U, - 18144558976U, 18152947328U, 18161336192U, 18169724288U, 18178108544U, - 18186498944U, 18194886784U, 18203275648U, 18211666048U, 18220048768U, - 18228444544U, 18236833408U, 18245220736U -}; - - -// Generated with the following Mathematica Code: - -// GetCacheSizes[n_] := Module[{ -// DataSetSizeBytesInit = 2^30, -// MixBytes = 128, -// DataSetGrowth = 2^23, -// HashBytes = 64, -// CacheMultiplier = 1024, -// j = 0}, -// Reap[ -// While[j < n, -// Module[{i = Floor[(DataSetSizeBytesInit + DataSetGrowth * j) / (CacheMultiplier * HashBytes)]}, -// While[! PrimeQ[i], i--]; -// Sow[i*HashBytes]; j++]]]][[2]][[1]] - -const uint64_t cache_sizes[2048] = { - 16776896U, 16907456U, 17039296U, 17170112U, 17301056U, 17432512U, 17563072U, - 17693888U, 17824192U, 17955904U, 18087488U, 18218176U, 18349504U, 18481088U, - 18611392U, 18742336U, 18874304U, 19004224U, 19135936U, 19267264U, 19398208U, - 19529408U, 19660096U, 19791424U, 19922752U, 20053952U, 20184896U, 20315968U, - 20446912U, 20576576U, 20709184U, 20840384U, 20971072U, 21102272U, 21233216U, - 21364544U, 21494848U, 21626816U, 21757376U, 21887552U, 22019392U, 22151104U, - 22281536U, 22412224U, 22543936U, 22675264U, 22806464U, 22935872U, 23068096U, - 23198272U, 23330752U, 23459008U, 23592512U, 23723968U, 23854912U, 23986112U, - 24116672U, 24247616U, 24378688U, 24509504U, 24640832U, 24772544U, 24903488U, - 25034432U, 25165376U, 25296704U, 25427392U, 25558592U, 25690048U, 25820096U, - 25951936U, 26081728U, 26214208U, 26345024U, 26476096U, 26606656U, 26737472U, - 26869184U, 26998208U, 27131584U, 27262528U, 27393728U, 27523904U, 27655744U, - 27786688U, 27917888U, 28049344U, 28179904U, 28311488U, 28441792U, 28573504U, - 28700864U, 28835648U, 28966208U, 29096768U, 29228608U, 29359808U, 29490752U, - 29621824U, 29752256U, 29882816U, 30014912U, 30144448U, 30273728U, 30406976U, - 30538432U, 30670784U, 30799936U, 30932672U, 31063744U, 31195072U, 31325248U, - 31456192U, 31588288U, 31719232U, 31850432U, 31981504U, 32110784U, 32243392U, - 32372672U, 32505664U, 32636608U, 32767808U, 32897344U, 33029824U, 33160768U, - 33289664U, 33423296U, 33554368U, 33683648U, 33816512U, 33947456U, 34076992U, - 34208704U, 34340032U, 34471744U, 34600256U, 34734016U, 34864576U, 34993984U, - 35127104U, 35258176U, 35386688U, 35518528U, 35650624U, 35782336U, 35910976U, - 36044608U, 36175808U, 36305728U, 36436672U, 36568384U, 36699968U, 36830656U, - 36961984U, 37093312U, 37223488U, 37355072U, 37486528U, 37617472U, 37747904U, - 37879232U, 38009792U, 38141888U, 38272448U, 38403392U, 38535104U, 38660672U, - 38795584U, 38925632U, 39059264U, 39190336U, 39320768U, 39452096U, 39581632U, - 39713984U, 39844928U, 39974848U, 40107968U, 40238144U, 40367168U, 40500032U, - 40631744U, 40762816U, 40894144U, 41023552U, 41155904U, 41286208U, 41418304U, - 41547712U, 41680448U, 41811904U, 41942848U, 42073792U, 42204992U, 42334912U, - 42467008U, 42597824U, 42729152U, 42860096U, 42991552U, 43122368U, 43253696U, - 43382848U, 43515712U, 43646912U, 43777088U, 43907648U, 44039104U, 44170432U, - 44302144U, 44433344U, 44564288U, 44694976U, 44825152U, 44956864U, 45088448U, - 45219008U, 45350464U, 45481024U, 45612608U, 45744064U, 45874496U, 46006208U, - 46136768U, 46267712U, 46399424U, 46529344U, 46660672U, 46791488U, 46923328U, - 47053504U, 47185856U, 47316928U, 47447872U, 47579072U, 47710144U, 47839936U, - 47971648U, 48103232U, 48234176U, 48365248U, 48496192U, 48627136U, 48757312U, - 48889664U, 49020736U, 49149248U, 49283008U, 49413824U, 49545152U, 49675712U, - 49807168U, 49938368U, 50069056U, 50200256U, 50331584U, 50462656U, 50593472U, - 50724032U, 50853952U, 50986048U, 51117632U, 51248576U, 51379904U, 51510848U, - 51641792U, 51773248U, 51903296U, 52035136U, 52164032U, 52297664U, 52427968U, - 52557376U, 52690112U, 52821952U, 52952896U, 53081536U, 53213504U, 53344576U, - 53475776U, 53608384U, 53738816U, 53870528U, 54000832U, 54131776U, 54263744U, - 54394688U, 54525248U, 54655936U, 54787904U, 54918592U, 55049152U, 55181248U, - 55312064U, 55442752U, 55574336U, 55705024U, 55836224U, 55967168U, 56097856U, - 56228672U, 56358592U, 56490176U, 56621888U, 56753728U, 56884928U, 57015488U, - 57146816U, 57278272U, 57409216U, 57540416U, 57671104U, 57802432U, 57933632U, - 58064576U, 58195264U, 58326976U, 58457408U, 58588864U, 58720192U, 58849984U, - 58981696U, 59113024U, 59243456U, 59375552U, 59506624U, 59637568U, 59768512U, - 59897792U, 60030016U, 60161984U, 60293056U, 60423872U, 60554432U, 60683968U, - 60817216U, 60948032U, 61079488U, 61209664U, 61341376U, 61471936U, 61602752U, - 61733696U, 61865792U, 61996736U, 62127808U, 62259136U, 62389568U, 62520512U, - 62651584U, 62781632U, 62910784U, 63045056U, 63176128U, 63307072U, 63438656U, - 63569216U, 63700928U, 63831616U, 63960896U, 64093888U, 64225088U, 64355392U, - 64486976U, 64617664U, 64748608U, 64879424U, 65009216U, 65142464U, 65273792U, - 65402816U, 65535424U, 65666752U, 65797696U, 65927744U, 66060224U, 66191296U, - 66321344U, 66453056U, 66584384U, 66715328U, 66846656U, 66977728U, 67108672U, - 67239104U, 67370432U, 67501888U, 67631296U, 67763776U, 67895104U, 68026304U, - 68157248U, 68287936U, 68419264U, 68548288U, 68681408U, 68811968U, 68942912U, - 69074624U, 69205568U, 69337024U, 69467584U, 69599168U, 69729472U, 69861184U, - 69989824U, 70122944U, 70253888U, 70385344U, 70515904U, 70647232U, 70778816U, - 70907968U, 71040832U, 71171648U, 71303104U, 71432512U, 71564992U, 71695168U, - 71826368U, 71958464U, 72089536U, 72219712U, 72350144U, 72482624U, 72613568U, - 72744512U, 72875584U, 73006144U, 73138112U, 73268672U, 73400128U, 73530944U, - 73662272U, 73793344U, 73924544U, 74055104U, 74185792U, 74316992U, 74448832U, - 74579392U, 74710976U, 74841664U, 74972864U, 75102784U, 75233344U, 75364544U, - 75497024U, 75627584U, 75759296U, 75890624U, 76021696U, 76152256U, 76283072U, - 76414144U, 76545856U, 76676672U, 76806976U, 76937792U, 77070016U, 77200832U, - 77331392U, 77462464U, 77593664U, 77725376U, 77856448U, 77987776U, 78118336U, - 78249664U, 78380992U, 78511424U, 78642496U, 78773056U, 78905152U, 79033664U, - 79166656U, 79297472U, 79429568U, 79560512U, 79690816U, 79822784U, 79953472U, - 80084672U, 80214208U, 80346944U, 80477632U, 80608576U, 80740288U, 80870848U, - 81002048U, 81133504U, 81264448U, 81395648U, 81525952U, 81657536U, 81786304U, - 81919808U, 82050112U, 82181312U, 82311616U, 82443968U, 82573376U, 82705984U, - 82835776U, 82967744U, 83096768U, 83230528U, 83359552U, 83491264U, 83622464U, - 83753536U, 83886016U, 84015296U, 84147776U, 84277184U, 84409792U, 84540608U, - 84672064U, 84803008U, 84934336U, 85065152U, 85193792U, 85326784U, 85458496U, - 85589312U, 85721024U, 85851968U, 85982656U, 86112448U, 86244416U, 86370112U, - 86506688U, 86637632U, 86769344U, 86900672U, 87031744U, 87162304U, 87293632U, - 87424576U, 87555392U, 87687104U, 87816896U, 87947968U, 88079168U, 88211264U, - 88341824U, 88473152U, 88603712U, 88735424U, 88862912U, 88996672U, 89128384U, - 89259712U, 89390272U, 89521984U, 89652544U, 89783872U, 89914816U, 90045376U, - 90177088U, 90307904U, 90438848U, 90569152U, 90700096U, 90832832U, 90963776U, - 91093696U, 91223744U, 91356992U, 91486784U, 91618496U, 91749824U, 91880384U, - 92012224U, 92143552U, 92273344U, 92405696U, 92536768U, 92666432U, 92798912U, - 92926016U, 93060544U, 93192128U, 93322816U, 93453632U, 93583936U, 93715136U, - 93845056U, 93977792U, 94109504U, 94240448U, 94371776U, 94501184U, 94632896U, - 94764224U, 94895552U, 95023424U, 95158208U, 95287744U, 95420224U, 95550016U, - 95681216U, 95811904U, 95943872U, 96075328U, 96203584U, 96337856U, 96468544U, - 96599744U, 96731072U, 96860992U, 96992576U, 97124288U, 97254848U, 97385536U, - 97517248U, 97647808U, 97779392U, 97910464U, 98041408U, 98172608U, 98303168U, - 98434496U, 98565568U, 98696768U, 98827328U, 98958784U, 99089728U, 99220928U, - 99352384U, 99482816U, 99614272U, 99745472U, 99876416U, 100007104U, - 100138048U, 100267072U, 100401088U, 100529984U, 100662592U, 100791872U, - 100925248U, 101056064U, 101187392U, 101317952U, 101449408U, 101580608U, - 101711296U, 101841728U, 101973824U, 102104896U, 102235712U, 102366016U, - 102498112U, 102628672U, 102760384U, 102890432U, 103021888U, 103153472U, - 103284032U, 103415744U, 103545152U, 103677248U, 103808576U, 103939648U, - 104070976U, 104201792U, 104332736U, 104462528U, 104594752U, 104725952U, - 104854592U, 104988608U, 105118912U, 105247808U, 105381184U, 105511232U, - 105643072U, 105774784U, 105903296U, 106037056U, 106167872U, 106298944U, - 106429504U, 106561472U, 106691392U, 106822592U, 106954304U, 107085376U, - 107216576U, 107346368U, 107478464U, 107609792U, 107739712U, 107872192U, - 108003136U, 108131392U, 108265408U, 108396224U, 108527168U, 108657344U, - 108789568U, 108920384U, 109049792U, 109182272U, 109312576U, 109444928U, - 109572928U, 109706944U, 109837888U, 109969088U, 110099648U, 110230976U, - 110362432U, 110492992U, 110624704U, 110755264U, 110886208U, 111017408U, - 111148864U, 111279296U, 111410752U, 111541952U, 111673024U, 111803456U, - 111933632U, 112066496U, 112196416U, 112328512U, 112457792U, 112590784U, - 112715968U, 112852672U, 112983616U, 113114944U, 113244224U, 113376448U, - 113505472U, 113639104U, 113770304U, 113901376U, 114031552U, 114163264U, - 114294592U, 114425536U, 114556864U, 114687424U, 114818624U, 114948544U, - 115080512U, 115212224U, 115343296U, 115473472U, 115605184U, 115736128U, - 115867072U, 115997248U, 116128576U, 116260288U, 116391488U, 116522944U, - 116652992U, 116784704U, 116915648U, 117046208U, 117178304U, 117308608U, - 117440192U, 117569728U, 117701824U, 117833024U, 117964096U, 118094656U, - 118225984U, 118357312U, 118489024U, 118617536U, 118749632U, 118882112U, - 119012416U, 119144384U, 119275328U, 119406016U, 119537344U, 119668672U, - 119798464U, 119928896U, 120061376U, 120192832U, 120321728U, 120454336U, - 120584512U, 120716608U, 120848192U, 120979136U, 121109056U, 121241408U, - 121372352U, 121502912U, 121634752U, 121764416U, 121895744U, 122027072U, - 122157632U, 122289088U, 122421184U, 122550592U, 122682944U, 122813888U, - 122945344U, 123075776U, 123207488U, 123338048U, 123468736U, 123600704U, - 123731264U, 123861952U, 123993664U, 124124608U, 124256192U, 124386368U, - 124518208U, 124649024U, 124778048U, 124911296U, 125041088U, 125173696U, - 125303744U, 125432896U, 125566912U, 125696576U, 125829056U, 125958592U, - 126090304U, 126221248U, 126352832U, 126483776U, 126615232U, 126746432U, - 126876608U, 127008704U, 127139392U, 127270336U, 127401152U, 127532224U, - 127663552U, 127794752U, 127925696U, 128055232U, 128188096U, 128319424U, - 128449856U, 128581312U, 128712256U, 128843584U, 128973632U, 129103808U, - 129236288U, 129365696U, 129498944U, 129629888U, 129760832U, 129892288U, - 130023104U, 130154048U, 130283968U, 130416448U, 130547008U, 130678336U, - 130807616U, 130939456U, 131071552U, 131202112U, 131331776U, 131464384U, - 131594048U, 131727296U, 131858368U, 131987392U, 132120256U, 132250816U, - 132382528U, 132513728U, 132644672U, 132774976U, 132905792U, 133038016U, - 133168832U, 133299392U, 133429312U, 133562048U, 133692992U, 133823296U, - 133954624U, 134086336U, 134217152U, 134348608U, 134479808U, 134607296U, - 134741056U, 134872384U, 135002944U, 135134144U, 135265472U, 135396544U, - 135527872U, 135659072U, 135787712U, 135921472U, 136052416U, 136182848U, - 136313792U, 136444864U, 136576448U, 136707904U, 136837952U, 136970048U, - 137099584U, 137232064U, 137363392U, 137494208U, 137625536U, 137755712U, - 137887424U, 138018368U, 138149824U, 138280256U, 138411584U, 138539584U, - 138672832U, 138804928U, 138936128U, 139066688U, 139196864U, 139328704U, - 139460032U, 139590208U, 139721024U, 139852864U, 139984576U, 140115776U, - 140245696U, 140376512U, 140508352U, 140640064U, 140769856U, 140902336U, - 141032768U, 141162688U, 141294016U, 141426496U, 141556544U, 141687488U, - 141819584U, 141949888U, 142080448U, 142212544U, 142342336U, 142474432U, - 142606144U, 142736192U, 142868288U, 142997824U, 143129408U, 143258944U, - 143392448U, 143523136U, 143653696U, 143785024U, 143916992U, 144045632U, - 144177856U, 144309184U, 144440768U, 144570688U, 144701888U, 144832448U, - 144965056U, 145096384U, 145227584U, 145358656U, 145489856U, 145620928U, - 145751488U, 145883072U, 146011456U, 146144704U, 146275264U, 146407232U, - 146538176U, 146668736U, 146800448U, 146931392U, 147062336U, 147193664U, - 147324224U, 147455936U, 147586624U, 147717056U, 147848768U, 147979456U, - 148110784U, 148242368U, 148373312U, 148503232U, 148635584U, 148766144U, - 148897088U, 149028416U, 149159488U, 149290688U, 149420224U, 149551552U, - 149683136U, 149814976U, 149943616U, 150076352U, 150208064U, 150338624U, - 150470464U, 150600256U, 150732224U, 150862784U, 150993088U, 151125952U, - 151254976U, 151388096U, 151519168U, 151649728U, 151778752U, 151911104U, - 152042944U, 152174144U, 152304704U, 152435648U, 152567488U, 152698816U, - 152828992U, 152960576U, 153091648U, 153222976U, 153353792U, 153484096U, - 153616192U, 153747008U, 153878336U, 154008256U, 154139968U, 154270912U, - 154402624U, 154533824U, 154663616U, 154795712U, 154926272U, 155057984U, - 155188928U, 155319872U, 155450816U, 155580608U, 155712064U, 155843392U, - 155971136U, 156106688U, 156237376U, 156367424U, 156499264U, 156630976U, - 156761536U, 156892352U, 157024064U, 157155008U, 157284416U, 157415872U, - 157545536U, 157677248U, 157810496U, 157938112U, 158071744U, 158203328U, - 158334656U, 158464832U, 158596288U, 158727616U, 158858048U, 158988992U, - 159121216U, 159252416U, 159381568U, 159513152U, 159645632U, 159776192U, - 159906496U, 160038464U, 160169536U, 160300352U, 160430656U, 160563008U, - 160693952U, 160822208U, 160956352U, 161086784U, 161217344U, 161349184U, - 161480512U, 161611456U, 161742272U, 161873216U, 162002752U, 162135872U, - 162266432U, 162397888U, 162529216U, 162660032U, 162790976U, 162922048U, - 163052096U, 163184576U, 163314752U, 163446592U, 163577408U, 163707968U, - 163839296U, 163969984U, 164100928U, 164233024U, 164364224U, 164494912U, - 164625856U, 164756672U, 164887616U, 165019072U, 165150016U, 165280064U, - 165412672U, 165543104U, 165674944U, 165805888U, 165936832U, 166067648U, - 166198336U, 166330048U, 166461248U, 166591552U, 166722496U, 166854208U, - 166985408U, 167116736U, 167246656U, 167378368U, 167508416U, 167641024U, - 167771584U, 167903168U, 168034112U, 168164032U, 168295744U, 168427456U, - 168557632U, 168688448U, 168819136U, 168951616U, 169082176U, 169213504U, - 169344832U, 169475648U, 169605952U, 169738048U, 169866304U, 169999552U, - 170131264U, 170262464U, 170393536U, 170524352U, 170655424U, 170782016U, - 170917696U, 171048896U, 171179072U, 171310784U, 171439936U, 171573184U, - 171702976U, 171835072U, 171966272U, 172097216U, 172228288U, 172359232U, - 172489664U, 172621376U, 172747712U, 172883264U, 173014208U, 173144512U, - 173275072U, 173407424U, 173539136U, 173669696U, 173800768U, 173931712U, - 174063424U, 174193472U, 174325696U, 174455744U, 174586816U, 174718912U, - 174849728U, 174977728U, 175109696U, 175242688U, 175374272U, 175504832U, - 175636288U, 175765696U, 175898432U, 176028992U, 176159936U, 176291264U, - 176422592U, 176552512U, 176684864U, 176815424U, 176946496U, 177076544U, - 177209152U, 177340096U, 177470528U, 177600704U, 177731648U, 177864256U, - 177994816U, 178126528U, 178257472U, 178387648U, 178518464U, 178650176U, - 178781888U, 178912064U, 179044288U, 179174848U, 179305024U, 179436736U, - 179568448U, 179698496U, 179830208U, 179960512U, 180092608U, 180223808U, - 180354752U, 180485696U, 180617152U, 180748096U, 180877504U, 181009984U, - 181139264U, 181272512U, 181402688U, 181532608U, 181663168U, 181795136U, - 181926592U, 182057536U, 182190016U, 182320192U, 182451904U, 182582336U, - 182713792U, 182843072U, 182976064U, 183107264U, 183237056U, 183368384U, - 183494848U, 183631424U, 183762752U, 183893824U, 184024768U, 184154816U, - 184286656U, 184417984U, 184548928U, 184680128U, 184810816U, 184941248U, - 185072704U, 185203904U, 185335616U, 185465408U, 185596352U, 185727296U, - 185859904U, 185989696U, 186121664U, 186252992U, 186383552U, 186514112U, - 186645952U, 186777152U, 186907328U, 187037504U, 187170112U, 187301824U, - 187429184U, 187562048U, 187693504U, 187825472U, 187957184U, 188087104U, - 188218304U, 188349376U, 188481344U, 188609728U, 188743616U, 188874304U, - 189005248U, 189136448U, 189265088U, 189396544U, 189528128U, 189660992U, - 189791936U, 189923264U, 190054208U, 190182848U, 190315072U, 190447424U, - 190577984U, 190709312U, 190840768U, 190971328U, 191102656U, 191233472U, - 191364032U, 191495872U, 191626816U, 191758016U, 191888192U, 192020288U, - 192148928U, 192282176U, 192413504U, 192542528U, 192674752U, 192805952U, - 192937792U, 193068608U, 193198912U, 193330496U, 193462208U, 193592384U, - 193723456U, 193854272U, 193985984U, 194116672U, 194247232U, 194379712U, - 194508352U, 194641856U, 194772544U, 194900672U, 195035072U, 195166016U, - 195296704U, 195428032U, 195558592U, 195690304U, 195818176U, 195952576U, - 196083392U, 196214336U, 196345792U, 196476736U, 196607552U, 196739008U, - 196869952U, 197000768U, 197130688U, 197262784U, 197394368U, 197523904U, - 197656384U, 197787584U, 197916608U, 198049472U, 198180544U, 198310208U, - 198442432U, 198573632U, 198705088U, 198834368U, 198967232U, 199097792U, - 199228352U, 199360192U, 199491392U, 199621696U, 199751744U, 199883968U, - 200014016U, 200146624U, 200276672U, 200408128U, 200540096U, 200671168U, - 200801984U, 200933312U, 201062464U, 201194944U, 201326144U, 201457472U, - 201588544U, 201719744U, 201850816U, 201981632U, 202111552U, 202244032U, - 202374464U, 202505152U, 202636352U, 202767808U, 202898368U, 203030336U, - 203159872U, 203292608U, 203423296U, 203553472U, 203685824U, 203816896U, - 203947712U, 204078272U, 204208192U, 204341056U, 204472256U, 204603328U, - 204733888U, 204864448U, 204996544U, 205125568U, 205258304U, 205388864U, - 205517632U, 205650112U, 205782208U, 205913536U, 206044736U, 206176192U, - 206307008U, 206434496U, 206569024U, 206700224U, 206831168U, 206961856U, - 207093056U, 207223616U, 207355328U, 207486784U, 207616832U, 207749056U, - 207879104U, 208010048U, 208141888U, 208273216U, 208404032U, 208534336U, - 208666048U, 208796864U, 208927424U, 209059264U, 209189824U, 209321792U, - 209451584U, 209582656U, 209715136U, 209845568U, 209976896U, 210106432U, - 210239296U, 210370112U, 210501568U, 210630976U, 210763712U, 210894272U, - 211024832U, 211156672U, 211287616U, 211418176U, 211549376U, 211679296U, - 211812032U, 211942592U, 212074432U, 212204864U, 212334016U, 212467648U, - 212597824U, 212727616U, 212860352U, 212991424U, 213120832U, 213253952U, - 213385024U, 213515584U, 213645632U, 213777728U, 213909184U, 214040128U, - 214170688U, 214302656U, 214433728U, 214564544U, 214695232U, 214826048U, - 214956992U, 215089088U, 215219776U, 215350592U, 215482304U, 215613248U, - 215743552U, 215874752U, 216005312U, 216137024U, 216267328U, 216399296U, - 216530752U, 216661696U, 216790592U, 216923968U, 217054528U, 217183168U, - 217316672U, 217448128U, 217579072U, 217709504U, 217838912U, 217972672U, - 218102848U, 218233024U, 218364736U, 218496832U, 218627776U, 218759104U, - 218888896U, 219021248U, 219151936U, 219281728U, 219413056U, 219545024U, - 219675968U, 219807296U, 219938624U, 220069312U, 220200128U, 220331456U, - 220461632U, 220592704U, 220725184U, 220855744U, 220987072U, 221117888U, - 221249216U, 221378368U, 221510336U, 221642048U, 221772736U, 221904832U, - 222031808U, 222166976U, 222297536U, 222428992U, 222559936U, 222690368U, - 222820672U, 222953152U, 223083968U, 223213376U, 223345984U, 223476928U, - 223608512U, 223738688U, 223869376U, 224001472U, 224132672U, 224262848U, - 224394944U, 224524864U, 224657344U, 224788288U, 224919488U, 225050432U, - 225181504U, 225312704U, 225443776U, 225574592U, 225704768U, 225834176U, - 225966784U, 226097216U, 226229824U, 226360384U, 226491712U, 226623424U, - 226754368U, 226885312U, 227015104U, 227147456U, 227278528U, 227409472U, - 227539904U, 227669696U, 227802944U, 227932352U, 228065216U, 228196288U, - 228326464U, 228457792U, 228588736U, 228720064U, 228850112U, 228981056U, - 229113152U, 229243328U, 229375936U, 229505344U, 229636928U, 229769152U, - 229894976U, 230030272U, 230162368U, 230292416U, 230424512U, 230553152U, - 230684864U, 230816704U, 230948416U, 231079616U, 231210944U, 231342016U, - 231472448U, 231603776U, 231733952U, 231866176U, 231996736U, 232127296U, - 232259392U, 232388672U, 232521664U, 232652608U, 232782272U, 232914496U, - 233043904U, 233175616U, 233306816U, 233438528U, 233569984U, 233699776U, - 233830592U, 233962688U, 234092224U, 234221888U, 234353984U, 234485312U, - 234618304U, 234749888U, 234880832U, 235011776U, 235142464U, 235274048U, - 235403456U, 235535936U, 235667392U, 235797568U, 235928768U, 236057152U, - 236190272U, 236322752U, 236453312U, 236583616U, 236715712U, 236846528U, - 236976448U, 237108544U, 237239104U, 237371072U, 237501632U, 237630784U, - 237764416U, 237895232U, 238026688U, 238157632U, 238286912U, 238419392U, - 238548032U, 238681024U, 238812608U, 238941632U, 239075008U, 239206336U, - 239335232U, 239466944U, 239599168U, 239730496U, 239861312U, 239992384U, - 240122816U, 240254656U, 240385856U, 240516928U, 240647872U, 240779072U, - 240909632U, 241040704U, 241171904U, 241302848U, 241433408U, 241565248U, - 241696192U, 241825984U, 241958848U, 242088256U, 242220224U, 242352064U, - 242481856U, 242611648U, 242744896U, 242876224U, 243005632U, 243138496U, - 243268672U, 243400384U, 243531712U, 243662656U, 243793856U, 243924544U, - 244054592U, 244187072U, 244316608U, 244448704U, 244580032U, 244710976U, - 244841536U, 244972864U, 245104448U, 245233984U, 245365312U, 245497792U, - 245628736U, 245759936U, 245889856U, 246021056U, 246152512U, 246284224U, - 246415168U, 246545344U, 246675904U, 246808384U, 246939584U, 247070144U, - 247199552U, 247331648U, 247463872U, 247593536U, 247726016U, 247857088U, - 247987648U, 248116928U, 248249536U, 248380736U, 248512064U, 248643008U, - 248773312U, 248901056U, 249036608U, 249167552U, 249298624U, 249429184U, - 249560512U, 249692096U, 249822784U, 249954112U, 250085312U, 250215488U, - 250345792U, 250478528U, 250608704U, 250739264U, 250870976U, 251002816U, - 251133632U, 251263552U, 251395136U, 251523904U, 251657792U, 251789248U, - 251919424U, 252051392U, 252182464U, 252313408U, 252444224U, 252575552U, - 252706624U, 252836032U, 252968512U, 253099712U, 253227584U, 253361728U, - 253493056U, 253623488U, 253754432U, 253885504U, 254017216U, 254148032U, - 254279488U, 254410432U, 254541376U, 254672576U, 254803264U, 254933824U, - 255065792U, 255196736U, 255326528U, 255458752U, 255589952U, 255721408U, - 255851072U, 255983296U, 256114624U, 256244416U, 256374208U, 256507712U, - 256636096U, 256768832U, 256900544U, 257031616U, 257162176U, 257294272U, - 257424448U, 257555776U, 257686976U, 257818432U, 257949632U, 258079552U, - 258211136U, 258342464U, 258473408U, 258603712U, 258734656U, 258867008U, - 258996544U, 259127744U, 259260224U, 259391296U, 259522112U, 259651904U, - 259784384U, 259915328U, 260045888U, 260175424U, 260308544U, 260438336U, - 260570944U, 260700992U, 260832448U, 260963776U, 261092672U, 261226304U, - 261356864U, 261487936U, 261619648U, 261750592U, 261879872U, 262011968U, - 262143424U, 262274752U, 262404416U, 262537024U, 262667968U, 262799296U, - 262928704U, 263061184U, 263191744U, 263322944U, 263454656U, 263585216U, - 263716672U, 263847872U, 263978944U, 264108608U, 264241088U, 264371648U, - 264501184U, 264632768U, 264764096U, 264895936U, 265024576U, 265158464U, - 265287488U, 265418432U, 265550528U, 265681216U, 265813312U, 265943488U, - 266075968U, 266206144U, 266337728U, 266468032U, 266600384U, 266731072U, - 266862272U, 266993344U, 267124288U, 267255616U, 267386432U, 267516992U, - 267648704U, 267777728U, 267910592U, 268040512U, 268172096U, 268302784U, - 268435264U, 268566208U, 268696256U, 268828096U, 268959296U, 269090368U, - 269221312U, 269352256U, 269482688U, 269614784U, 269745856U, 269876416U, - 270007616U, 270139328U, 270270272U, 270401216U, 270531904U, 270663616U, - 270791744U, 270924736U, 271056832U, 271186112U, 271317184U, 271449536U, - 271580992U, 271711936U, 271843136U, 271973056U, 272105408U, 272236352U, - 272367296U, 272498368U, 272629568U, 272759488U, 272891456U, 273022784U, - 273153856U, 273284672U, 273415616U, 273547072U, 273677632U, 273808448U, - 273937088U, 274071488U, 274200896U, 274332992U, 274463296U, 274595392U, - 274726208U, 274857536U, 274988992U, 275118656U, 275250496U, 275382208U, - 275513024U, 275643968U, 275775296U, 275906368U, 276037184U, 276167872U, - 276297664U, 276429376U, 276560576U, 276692672U, 276822976U, 276955072U, - 277085632U, 277216832U, 277347008U, 277478848U, 277609664U, 277740992U, - 277868608U, 278002624U, 278134336U, 278265536U, 278395328U, 278526784U, - 278657728U, 278789824U, 278921152U, 279052096U, 279182912U, 279313088U, - 279443776U, 279576256U, 279706048U, 279838528U, 279969728U, 280099648U, - 280230976U, 280361408U, 280493632U, 280622528U, 280755392U, 280887104U, - 281018176U, 281147968U, 281278912U, 281411392U, 281542592U, 281673152U, - 281803712U, 281935552U, 282066496U, 282197312U, 282329024U, 282458816U, - 282590272U, 282720832U, 282853184U, 282983744U, 283115072U, 283246144U, - 283377344U, 283508416U, 283639744U, 283770304U, 283901504U, 284032576U, - 284163136U, 284294848U, 284426176U, 284556992U, 284687296U, 284819264U, - 284950208U, 285081536U -}; - -#ifdef __cplusplus -} -#endif diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/endian.h b/vendor/github.com/ubiq/ubqhash/src/libubqhash/endian.h deleted file mode 100644 index 02e4048081..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/endian.h +++ /dev/null @@ -1,78 +0,0 @@ -#pragma once - -#include -#include "compiler.h" - -#if defined(__MINGW32__) || defined(_WIN32) - # define LITTLE_ENDIAN 1234 - # define BYTE_ORDER LITTLE_ENDIAN -#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) - # include -#elif defined(__OpenBSD__) || defined(__SVR4) - # include -#elif defined(__APPLE__) -# include -#elif defined( BSD ) && (BSD >= 199103) - # include -#elif defined( __QNXNTO__ ) && defined( __LITTLEENDIAN__ ) - # define LITTLE_ENDIAN 1234 - # define BYTE_ORDER LITTLE_ENDIAN -#elif defined( __QNXNTO__ ) && defined( __BIGENDIAN__ ) - # define BIG_ENDIAN 1234 - # define BYTE_ORDER BIG_ENDIAN -#else -# include -#endif - -#if defined(_WIN32) -#include -#define ubqhash_swap_u32(input_) _byteswap_ulong(input_) -#define ubqhash_swap_u64(input_) _byteswap_uint64(input_) -#elif defined(__APPLE__) -#include -#define ubqhash_swap_u32(input_) OSSwapInt32(input_) -#define ubqhash_swap_u64(input_) OSSwapInt64(input_) -#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) -#define ubqhash_swap_u32(input_) bswap32(input_) -#define ubqhash_swap_u64(input_) bswap64(input_) -#elif defined(__OpenBSD__) -#include -#define ubqhash_swap_u32(input_) swap32(input_) -#define ubqhash_swap_u64(input_) swap64(input_) -#else // posix -#include -#define ubqhash_swap_u32(input_) bswap_32(input_) -#define ubqhash_swap_u64(input_) bswap_64(input_) -#endif - - -#if LITTLE_ENDIAN == BYTE_ORDER - -#define fix_endian32(dst_ ,src_) dst_ = src_ -#define fix_endian32_same(val_) -#define fix_endian64(dst_, src_) dst_ = src_ -#define fix_endian64_same(val_) -#define fix_endian_arr32(arr_, size_) -#define fix_endian_arr64(arr_, size_) - -#elif BIG_ENDIAN == BYTE_ORDER - -#define fix_endian32(dst_, src_) dst_ = ubqhash_swap_u32(src_) -#define fix_endian32_same(val_) val_ = ubqhash_swap_u32(val_) -#define fix_endian64(dst_, src_) dst_ = ubqhash_swap_u64(src_) -#define fix_endian64_same(val_) val_ = ubqhash_swap_u64(val_) -#define fix_endian_arr32(arr_, size_) \ - do { \ - for (unsigned i_ = 0; i_ < (size_); ++i_) { \ - arr_[i_] = ubqhash_swap_u32(arr_[i_]); \ - } \ - } while (0) -#define fix_endian_arr64(arr_, size_) \ - do { \ - for (unsigned i_ = 0; i_ < (size_); ++i_) { \ - arr_[i_] = ubqhash_swap_u64(arr_[i_]); \ - } \ - } while (0) -#else -# error "endian not supported" -#endif // BYTE_ORDER diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/fnv.h b/vendor/github.com/ubiq/ubqhash/src/libubqhash/fnv.h deleted file mode 100644 index 82cd655c41..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/fnv.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-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. - - cpp-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 cpp-ethereum. If not, see . -*/ -/** @file fnv.h -* @author Matthew Wampler-Doty -* @date 2015 -*/ - -#pragma once -#include -#include "compiler.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define FNV_PRIME 0x01000193 - -/* The FNV-1 spec multiplies the prime with the input one byte (octet) in turn. - We instead multiply it with the full 32-bit input. - This gives a different result compared to a canonical FNV-1 implementation. -*/ -static inline uint32_t fnv_hash(uint32_t const x, uint32_t const y) -{ - return x * FNV_PRIME ^ y; -} - -#ifdef __cplusplus -} -#endif diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/internal.c b/vendor/github.com/ubiq/ubqhash/src/libubqhash/internal.c deleted file mode 100644 index b6edd15964..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/internal.c +++ /dev/null @@ -1,553 +0,0 @@ -/* - This file is part of ubqhash. - - ubqhash 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. - - ubqhash 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 cpp-ethereum. If not, see . -*/ -/** @file internal.c -* @author Tim Hughes -* @author Matthew Wampler-Doty -* @date 2015 -*/ - -#include -#include -#include -#include -#include -#include "mmap.h" -#include "ubqhash.h" -#include "fnv.h" -#include "endian.h" -#include "internal.h" -#include "data_sizes.h" -#include "io.h" - -#ifdef WITH_CRYPTOPP - -#include "sha3_cryptopp.h" -#include "blake2_cryptopp.h" - -#else -#include "sha3.h" -#include "blake2.h" -#endif // WITH_CRYPTOPP - -uint64_t ubqhash_get_datasize(uint64_t const block_number) -{ - assert(block_number / UBQHASH_EPOCH_LENGTH < 2048); - return dag_sizes[block_number / UBQHASH_EPOCH_LENGTH]; -} - -uint64_t ubqhash_get_cachesize(uint64_t const block_number) -{ - assert(block_number / UBQHASH_EPOCH_LENGTH < 2048); - return cache_sizes[block_number / UBQHASH_EPOCH_LENGTH]; -} - -// Follows Sergio's "STRICT MEMORY HARD HASHING FUNCTIONS" (2014) -// https://bitslog.files.wordpress.com/2013/12/memohash-v0-3.pdf -// SeqMemoHash(s, R, N) -bool static ubqhash_compute_cache_nodes( - node* const nodes, - uint64_t cache_size, - ubqhash_h256_t const* seed -) -{ - if (cache_size % sizeof(node) != 0) { - return false; - } - uint32_t const num_nodes = (uint32_t) (cache_size / sizeof(node)); - - SHA3_512(nodes[0].bytes, (uint8_t*)seed, 32); - - for (uint32_t i = 1; i != num_nodes; ++i) { - SHA3_512(nodes[i].bytes, nodes[i - 1].bytes, 64); - } - - for (uint32_t j = 0; j != UBQHASH_CACHE_ROUNDS; j++) { - for (uint32_t i = 0; i != num_nodes; i++) { - uint32_t const idx = nodes[i].words[0] % num_nodes; - node data; - data = nodes[(num_nodes - 1 + i) % num_nodes]; - for (uint32_t w = 0; w != NODE_WORDS; ++w) { - data.words[w] ^= nodes[idx].words[w]; - } - SHA3_512(nodes[i].bytes, data.bytes, sizeof(data)); - } - } - - // now perform endian conversion - fix_endian_arr32(nodes->words, num_nodes * NODE_WORDS); - return true; -} - -bool static ubqhash_compute_cache_nodes_uip1( - node* const nodes, - uint64_t cache_size, - ubqhash_h256_t const* seed -) -{ - if (cache_size % sizeof(node) != 0) { - return false; - } - uint32_t const num_nodes = (uint32_t) (cache_size / sizeof(node)); - - BLAKE2B_512(nodes[0].bytes, (uint8_t*)seed, 32); - - for (uint32_t i = 1; i != num_nodes; ++i) { - BLAKE2B_512(nodes[i].bytes, nodes[i - 1].bytes, 64); - } - - for (uint32_t j = 0; j != UBQHASH_CACHE_ROUNDS; j++) { - for (uint32_t i = 0; i != num_nodes; i++) { - uint32_t const idx = nodes[i].words[0] % num_nodes; - node data; - data = nodes[(num_nodes - 1 + i) % num_nodes]; - for (uint32_t w = 0; w != NODE_WORDS; ++w) { - data.words[w] ^= nodes[idx].words[w]; - } - BLAKE2B_512(nodes[i].bytes, data.bytes, sizeof(data)); - } - } - - // now perform endian conversion - fix_endian_arr32(nodes->words, num_nodes * NODE_WORDS); - return true; -} - -void ubqhash_calculate_dag_item( - node* const ret, - uint32_t node_index, - ubqhash_light_t const light -) -{ - uint32_t num_parent_nodes = (uint32_t) (light->cache_size / sizeof(node)); - node const* cache_nodes = (node const *) light->cache; - node const* init = &cache_nodes[node_index % num_parent_nodes]; - memcpy(ret, init, sizeof(node)); - ret->words[0] ^= node_index; - SHA3_512(ret->bytes, ret->bytes, sizeof(node)); -#if defined(_M_X64) && ENABLE_SSE - __m128i const fnv_prime = _mm_set1_epi32(FNV_PRIME); - __m128i xmm0 = ret->xmm[0]; - __m128i xmm1 = ret->xmm[1]; - __m128i xmm2 = ret->xmm[2]; - __m128i xmm3 = ret->xmm[3]; -#endif - - for (uint32_t i = 0; i != UBQHASH_DATASET_PARENTS; ++i) { - uint32_t parent_index = fnv_hash(node_index ^ i, ret->words[i % NODE_WORDS]) % num_parent_nodes; - node const *parent = &cache_nodes[parent_index]; - -#if defined(_M_X64) && ENABLE_SSE - { - xmm0 = _mm_mullo_epi32(xmm0, fnv_prime); - xmm1 = _mm_mullo_epi32(xmm1, fnv_prime); - xmm2 = _mm_mullo_epi32(xmm2, fnv_prime); - xmm3 = _mm_mullo_epi32(xmm3, fnv_prime); - xmm0 = _mm_xor_si128(xmm0, parent->xmm[0]); - xmm1 = _mm_xor_si128(xmm1, parent->xmm[1]); - xmm2 = _mm_xor_si128(xmm2, parent->xmm[2]); - xmm3 = _mm_xor_si128(xmm3, parent->xmm[3]); - - // have to write to ret as values are used to compute index - ret->xmm[0] = xmm0; - ret->xmm[1] = xmm1; - ret->xmm[2] = xmm2; - ret->xmm[3] = xmm3; - } - #else - { - for (unsigned w = 0; w != NODE_WORDS; ++w) { - ret->words[w] = fnv_hash(ret->words[w], parent->words[w]); - } - } -#endif - } - SHA3_512(ret->bytes, ret->bytes, sizeof(node)); -} - -bool ubqhash_compute_full_data( - void* mem, - uint64_t full_size, - ubqhash_light_t const light, - ubqhash_callback_t callback -) -{ - if (full_size % (sizeof(uint32_t) * MIX_WORDS) != 0 || - (full_size % sizeof(node)) != 0) { - return false; - } - uint32_t const max_n = (uint32_t)(full_size / sizeof(node)); - node* full_nodes = mem; - double const progress_change = 1.0f / max_n; - double progress = 0.0f; - // now compute full nodes - for (uint32_t n = 0; n != max_n; ++n) { - if (callback && - n % (max_n / 100) == 0 && - callback((unsigned int)(ceil(progress * 100.0f))) != 0) { - - return false; - } - progress += progress_change; - ubqhash_calculate_dag_item(&(full_nodes[n]), n, light); - } - return true; -} - -static bool ubqhash_hash( - ubqhash_return_value_t* ret, - node const* full_nodes, - ubqhash_light_t const light, - uint64_t full_size, - ubqhash_h256_t const header_hash, - uint64_t const nonce -) -{ - if (full_size % MIX_WORDS != 0) { - return false; - } - - // pack hash and nonce together into first 40 bytes of s_mix - assert(sizeof(node) * 8 == 512); - node s_mix[MIX_NODES + 1]; - memcpy(s_mix[0].bytes, &header_hash, 32); - fix_endian64(s_mix[0].double_words[4], nonce); - - // compute sha3-512 hash and replicate across mix - SHA3_512(s_mix->bytes, s_mix->bytes, 40); - fix_endian_arr32(s_mix[0].words, 16); - - node* const mix = s_mix + 1; - for (uint32_t w = 0; w != MIX_WORDS; ++w) { - mix->words[w] = s_mix[0].words[w % NODE_WORDS]; - } - - unsigned const page_size = sizeof(uint32_t) * MIX_WORDS; - unsigned const num_full_pages = (unsigned) (full_size / page_size); - - for (unsigned i = 0; i != UBQHASH_ACCESSES; ++i) { - uint32_t const index = fnv_hash(s_mix->words[0] ^ i, mix->words[i % MIX_WORDS]) % num_full_pages; - - for (unsigned n = 0; n != MIX_NODES; ++n) { - node const* dag_node; - if (full_nodes) { - dag_node = &full_nodes[MIX_NODES * index + n]; - } else { - node tmp_node; - ubqhash_calculate_dag_item(&tmp_node, index * MIX_NODES + n, light); - dag_node = &tmp_node; - } - -#if defined(_M_X64) && ENABLE_SSE - { - __m128i fnv_prime = _mm_set1_epi32(FNV_PRIME); - __m128i xmm0 = _mm_mullo_epi32(fnv_prime, mix[n].xmm[0]); - __m128i xmm1 = _mm_mullo_epi32(fnv_prime, mix[n].xmm[1]); - __m128i xmm2 = _mm_mullo_epi32(fnv_prime, mix[n].xmm[2]); - __m128i xmm3 = _mm_mullo_epi32(fnv_prime, mix[n].xmm[3]); - mix[n].xmm[0] = _mm_xor_si128(xmm0, dag_node->xmm[0]); - mix[n].xmm[1] = _mm_xor_si128(xmm1, dag_node->xmm[1]); - mix[n].xmm[2] = _mm_xor_si128(xmm2, dag_node->xmm[2]); - mix[n].xmm[3] = _mm_xor_si128(xmm3, dag_node->xmm[3]); - } - #else - { - for (unsigned w = 0; w != NODE_WORDS; ++w) { - mix[n].words[w] = fnv_hash(mix[n].words[w], dag_node->words[w]); - } - } -#endif - } - - } - - // compress mix - for (uint32_t w = 0; w != MIX_WORDS; w += 4) { - uint32_t reduction = mix->words[w + 0]; - reduction = reduction * FNV_PRIME ^ mix->words[w + 1]; - reduction = reduction * FNV_PRIME ^ mix->words[w + 2]; - reduction = reduction * FNV_PRIME ^ mix->words[w + 3]; - mix->words[w / 4] = reduction; - } - - fix_endian_arr32(mix->words, MIX_WORDS / 4); - memcpy(&ret->mix_hash, mix->bytes, 32); - // final Keccak hash - SHA3_256(&ret->result, s_mix->bytes, 64 + 32); // Keccak-256(s + compressed_mix) - return true; -} - -void ubqhash_quick_hash( - ubqhash_h256_t* return_hash, - ubqhash_h256_t const* header_hash, - uint64_t nonce, - ubqhash_h256_t const* mix_hash -) -{ - uint8_t buf[64 + 32]; - memcpy(buf, header_hash, 32); - fix_endian64_same(nonce); - memcpy(&(buf[32]), &nonce, 8); - SHA3_512(buf, buf, 40); - memcpy(&(buf[64]), mix_hash, 32); - SHA3_256(return_hash, buf, 64 + 32); -} - -ubqhash_h256_t ubqhash_get_seedhash(uint64_t block_number) -{ - ubqhash_h256_t ret; - ubqhash_h256_reset(&ret); - uint64_t const epochs = block_number / UBQHASH_EPOCH_LENGTH; - for (uint32_t i = 0; i < epochs; ++i) - SHA3_256(&ret, (uint8_t*)&ret, 32); - return ret; -} - -bool ubqhash_quick_check_difficulty( - ubqhash_h256_t const* header_hash, - uint64_t const nonce, - ubqhash_h256_t const* mix_hash, - ubqhash_h256_t const* boundary -) -{ - - ubqhash_h256_t return_hash; - ubqhash_quick_hash(&return_hash, header_hash, nonce, mix_hash); - return ubqhash_check_difficulty(&return_hash, boundary); -} - -ubqhash_light_t ubqhash_light_new_internal(uint64_t cache_size, ubqhash_h256_t const* seed, bool uip1) -{ - struct ubqhash_light *ret; - ret = calloc(sizeof(*ret), 1); - if (!ret) { - return NULL; - } - ret->cache = malloc((size_t)cache_size); - if (!ret->cache) { - goto fail_free_light; - } - node* nodes = (node*)ret->cache; - if (uip1) { - if (!ubqhash_compute_cache_nodes_uip1(nodes, cache_size, seed)) { - goto fail_free_cache_mem; - } - } else { - if (!ubqhash_compute_cache_nodes(nodes, cache_size, seed)) { - goto fail_free_cache_mem; - } - } - ret->cache_size = cache_size; - return ret; - -fail_free_cache_mem: - free(ret->cache); -fail_free_light: - free(ret); - return NULL; -} - -ubqhash_light_t ubqhash_light_new(uint64_t block_number) -{ - ubqhash_h256_t seedhash = ubqhash_get_seedhash(block_number); - ubqhash_light_t ret; - if (block_number >= UBQHASH_EPOCH_LENGTH * UBQHASH_UIP1_EPOCH) { - ret = ubqhash_light_new_internal(ubqhash_get_cachesize(block_number), &seedhash, true); - } else { - ret = ubqhash_light_new_internal(ubqhash_get_cachesize(block_number), &seedhash, false); - } - ret->block_number = block_number; - return ret; -} - -void ubqhash_light_delete(ubqhash_light_t light) -{ - if (light->cache) { - free(light->cache); - } - free(light); -} - -ubqhash_return_value_t ubqhash_light_compute_internal( - ubqhash_light_t light, - uint64_t full_size, - ubqhash_h256_t const header_hash, - uint64_t nonce -) -{ - ubqhash_return_value_t ret; - ret.success = true; - if (!ubqhash_hash(&ret, NULL, light, full_size, header_hash, nonce)) { - ret.success = false; - } - return ret; -} - -ubqhash_return_value_t ubqhash_light_compute( - ubqhash_light_t light, - ubqhash_h256_t const header_hash, - uint64_t nonce -) -{ - uint64_t full_size = ubqhash_get_datasize(light->block_number); - return ubqhash_light_compute_internal(light, full_size, header_hash, nonce); -} - -static bool ubqhash_mmap(struct ubqhash_full* ret, FILE* f) -{ - int fd; - char* mmapped_data; - errno = 0; - ret->file = f; - if ((fd = ubqhash_fileno(ret->file)) == -1) { - return false; - } - mmapped_data= mmap( - NULL, - (size_t)ret->file_size + UBQHASH_DAG_MAGIC_NUM_SIZE, - PROT_READ | PROT_WRITE, - MAP_SHARED, - fd, - 0 - ); - if (mmapped_data == MAP_FAILED) { - return false; - } - ret->data = (node*)(mmapped_data + UBQHASH_DAG_MAGIC_NUM_SIZE); - return true; -} - -ubqhash_full_t ubqhash_full_new_internal( - char const* dirname, - ubqhash_h256_t const seed_hash, - uint64_t full_size, - ubqhash_light_t const light, - ubqhash_callback_t callback -) -{ - struct ubqhash_full* ret; - FILE *f = NULL; - ret = calloc(sizeof(*ret), 1); - if (!ret) { - return NULL; - } - ret->file_size = (size_t)full_size; - switch (ubqhash_io_prepare(dirname, seed_hash, &f, (size_t)full_size, false)) { - case UBQHASH_IO_FAIL: - // ubqhash_io_prepare will do all UBQHASH_CRITICAL() logging in fail case - goto fail_free_full; - case UBQHASH_IO_MEMO_MATCH: - if (!ubqhash_mmap(ret, f)) { - UBQHASH_CRITICAL("mmap failure()"); - goto fail_close_file; - } - return ret; - case UBQHASH_IO_MEMO_SIZE_MISMATCH: - // if a DAG of same filename but unexpected size is found, silently force new file creation - if (ubqhash_io_prepare(dirname, seed_hash, &f, (size_t)full_size, true) != UBQHASH_IO_MEMO_MISMATCH) { - UBQHASH_CRITICAL("Could not recreate DAG file after finding existing DAG with unexpected size."); - goto fail_free_full; - } - // fallthrough to the mismatch case here, DO NOT go through match - case UBQHASH_IO_MEMO_MISMATCH: - if (!ubqhash_mmap(ret, f)) { - UBQHASH_CRITICAL("mmap failure()"); - goto fail_close_file; - } - break; - } - - if (!ubqhash_compute_full_data(ret->data, full_size, light, callback)) { - UBQHASH_CRITICAL("Failure at computing DAG data."); - goto fail_free_full_data; - } - - // after the DAG has been filled then we finalize it by writting the magic number at the beginning - if (fseek(f, 0, SEEK_SET) != 0) { - UBQHASH_CRITICAL("Could not seek to DAG file start to write magic number."); - goto fail_free_full_data; - } - uint64_t const magic_num = UBQHASH_DAG_MAGIC_NUM; - if (fwrite(&magic_num, UBQHASH_DAG_MAGIC_NUM_SIZE, 1, f) != 1) { - UBQHASH_CRITICAL("Could not write magic number to DAG's beginning."); - goto fail_free_full_data; - } - if (fflush(f) != 0) {// make sure the magic number IS there - UBQHASH_CRITICAL("Could not flush memory mapped data to DAG file. Insufficient space?"); - goto fail_free_full_data; - } - return ret; - -fail_free_full_data: - // could check that munmap(..) == 0 but even if it did not can't really do anything here - munmap(ret->data, (size_t)full_size); -fail_close_file: - fclose(ret->file); -fail_free_full: - free(ret); - return NULL; -} - -ubqhash_full_t ubqhash_full_new(ubqhash_light_t light, ubqhash_callback_t callback) -{ - char strbuf[256]; - if (!ubqhash_get_default_dirname(strbuf, 256)) { - return NULL; - } - uint64_t full_size = ubqhash_get_datasize(light->block_number); - ubqhash_h256_t seedhash = ubqhash_get_seedhash(light->block_number); - return ubqhash_full_new_internal(strbuf, seedhash, full_size, light, callback); -} - -void ubqhash_full_delete(ubqhash_full_t full) -{ - // could check that munmap(..) == 0 but even if it did not can't really do anything here - munmap(full->data, (size_t)full->file_size); - if (full->file) { - fclose(full->file); - } - free(full); -} - -ubqhash_return_value_t ubqhash_full_compute( - ubqhash_full_t full, - ubqhash_h256_t const header_hash, - uint64_t nonce -) -{ - ubqhash_return_value_t ret; - ret.success = true; - if (!ubqhash_hash( - &ret, - (node const*)full->data, - NULL, - full->file_size, - header_hash, - nonce)) { - ret.success = false; - } - return ret; -} - -void const* ubqhash_full_dag(ubqhash_full_t full) -{ - return full->data; -} - -uint64_t ubqhash_full_dag_size(ubqhash_full_t full) -{ - return full->file_size; -} diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/internal.h b/vendor/github.com/ubiq/ubqhash/src/libubqhash/internal.h deleted file mode 100644 index a02774dec5..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/internal.h +++ /dev/null @@ -1,179 +0,0 @@ -#pragma once -#include "compiler.h" -#include "endian.h" -#include "ubqhash.h" -#include - -#define ENABLE_SSE 0 - -#if defined(_M_X64) && ENABLE_SSE -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -// compile time settings -#define NODE_WORDS (64/4) -#define MIX_WORDS (UBQHASH_MIX_BYTES/4) -#define MIX_NODES (MIX_WORDS / NODE_WORDS) -#include - -typedef union node { - uint8_t bytes[NODE_WORDS * 4]; - uint32_t words[NODE_WORDS]; - uint64_t double_words[NODE_WORDS / 2]; - -#if defined(_M_X64) && ENABLE_SSE - __m128i xmm[NODE_WORDS/4]; -#endif - -} node; - -static inline uint8_t ubqhash_h256_get(ubqhash_h256_t const* hash, unsigned int i) -{ - return hash->b[i]; -} - -static inline void ubqhash_h256_set(ubqhash_h256_t* hash, unsigned int i, uint8_t v) -{ - hash->b[i] = v; -} - -static inline void ubqhash_h256_reset(ubqhash_h256_t* hash) -{ - memset(hash, 0, 32); -} - -// Returns if hash is less than or equal to boundary (2^256/difficulty) -static inline bool ubqhash_check_difficulty( - ubqhash_h256_t const* hash, - ubqhash_h256_t const* boundary -) -{ - // Boundary is big endian - for (int i = 0; i < 32; i++) { - if (ubqhash_h256_get(hash, i) == ubqhash_h256_get(boundary, i)) { - continue; - } - return ubqhash_h256_get(hash, i) < ubqhash_h256_get(boundary, i); - } - return true; -} - -/** - * Difficulty quick check for POW preverification - * - * @param header_hash The hash of the header - * @param nonce The block's nonce - * @param mix_hash The mix digest hash - * @param boundary The boundary is defined as (2^256 / difficulty) - * @return true for succesful pre-verification and false otherwise - */ -bool ubqhash_quick_check_difficulty( - ubqhash_h256_t const* header_hash, - uint64_t const nonce, - ubqhash_h256_t const* mix_hash, - ubqhash_h256_t const* boundary -); - -struct ubqhash_light { - void* cache; - uint64_t cache_size; - uint64_t block_number; -}; - -/** - * Allocate and initialize a new ubqhash_light handler. Internal version - * - * @param cache_size The size of the cache in bytes - * @param seed Block seedhash to be used during the computation of the - * cache nodes - * @return Newly allocated ubqhash_light handler or NULL in case of - * ERRNOMEM or invalid parameters used for @ref ubqhash_compute_cache_nodes() - */ -ubqhash_light_t ubqhash_light_new_internal(uint64_t cache_size, ubqhash_h256_t const* seed, bool uip1); - -/** - * Calculate the light client data. Internal version. - * - * @param light The light client handler - * @param full_size The size of the full data in bytes. - * @param header_hash The header hash to pack into the mix - * @param nonce The nonce to pack into the mix - * @return The resulting hash. - */ -ubqhash_return_value_t ubqhash_light_compute_internal( - ubqhash_light_t light, - uint64_t full_size, - ubqhash_h256_t const header_hash, - uint64_t nonce -); - -struct ubqhash_full { - FILE* file; - uint64_t file_size; - node* data; -}; - -/** - * Allocate and initialize a new ubqhash_full handler. Internal version. - * - * @param dirname The directory in which to put the DAG file. - * @param seedhash The seed hash of the block. Used in the DAG file naming. - * @param full_size The size of the full data in bytes. - * @param cache A cache object to use that was allocated with @ref ubqhash_cache_new(). - * Iff this function succeeds the ubqhash_full_t will take memory - * memory ownership of the cache and free it at deletion. If - * not then the user still has to handle freeing of the cache himself. - * @param callback A callback function with signature of @ref ubqhash_callback_t - * It accepts an unsigned with which a progress of DAG calculation - * can be displayed. If all goes well the callback should return 0. - * If a non-zero value is returned then DAG generation will stop. - * @return Newly allocated ubqhash_full handler or NULL in case of - * ERRNOMEM or invalid parameters used for @ref ubqhash_compute_full_data() - */ -ubqhash_full_t ubqhash_full_new_internal( - char const* dirname, - ubqhash_h256_t const seed_hash, - uint64_t full_size, - ubqhash_light_t const light, - ubqhash_callback_t callback -); - -void ubqhash_calculate_dag_item( - node* const ret, - uint32_t node_index, - ubqhash_light_t const cache -); - -void ubqhash_quick_hash( - ubqhash_h256_t* return_hash, - ubqhash_h256_t const* header_hash, - const uint64_t nonce, - ubqhash_h256_t const* mix_hash -); - -uint64_t ubqhash_get_datasize(uint64_t const block_number); -uint64_t ubqhash_get_cachesize(uint64_t const block_number); - -/** - * Compute the memory data for a full node's memory - * - * @param mem A pointer to an ubqhash full's memory - * @param full_size The size of the full data in bytes - * @param cache A cache object to use in the calculation - * @param callback The callback function. Check @ref ubqhash_full_new() for details. - * @return true if all went fine and false for invalid parameters - */ -bool ubqhash_compute_full_data( - void* mem, - uint64_t full_size, - ubqhash_light_t const light, - ubqhash_callback_t callback -); - -#ifdef __cplusplus -} -#endif diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/io.c b/vendor/github.com/ubiq/ubqhash/src/libubqhash/io.c deleted file mode 100644 index 1342c6107b..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/io.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - This file is part of ubqhash. - - ubqhash 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. - - ubqhash 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 ubqhash. If not, see . -*/ -/** @file io.c - * @author Lefteris Karapetsas - * @date 2015 - */ -#include "io.h" -#include -#include -#include - -enum ubqhash_io_rc ubqhash_io_prepare( - char const* dirname, - ubqhash_h256_t const seedhash, - FILE** output_file, - uint64_t file_size, - bool force_create -) -{ - char mutable_name[DAG_MUTABLE_NAME_MAX_SIZE]; - enum ubqhash_io_rc ret = UBQHASH_IO_FAIL; - // reset errno before io calls - errno = 0; - - // assert directory exists - if (!ubqhash_mkdir(dirname)) { - UBQHASH_CRITICAL("Could not create the ubqhash directory"); - goto end; - } - - ubqhash_io_mutable_name(UBQHASH_REVISION, &seedhash, mutable_name); - char* tmpfile = ubqhash_io_create_filename(dirname, mutable_name, strlen(mutable_name)); - if (!tmpfile) { - UBQHASH_CRITICAL("Could not create the full DAG pathname"); - goto end; - } - - FILE *f; - if (!force_create) { - // try to open the file - f = ubqhash_fopen(tmpfile, "rb+"); - if (f) { - size_t found_size; - if (!ubqhash_file_size(f, &found_size)) { - fclose(f); - UBQHASH_CRITICAL("Could not query size of DAG file: \"%s\"", tmpfile); - goto free_memo; - } - if (file_size != found_size - UBQHASH_DAG_MAGIC_NUM_SIZE) { - fclose(f); - ret = UBQHASH_IO_MEMO_SIZE_MISMATCH; - goto free_memo; - } - // compare the magic number, no need to care about endianess since it's local - uint64_t magic_num; - if (fread(&magic_num, UBQHASH_DAG_MAGIC_NUM_SIZE, 1, f) != 1) { - // I/O error - fclose(f); - UBQHASH_CRITICAL("Could not read from DAG file: \"%s\"", tmpfile); - ret = UBQHASH_IO_MEMO_SIZE_MISMATCH; - goto free_memo; - } - if (magic_num != UBQHASH_DAG_MAGIC_NUM) { - fclose(f); - ret = UBQHASH_IO_MEMO_SIZE_MISMATCH; - goto free_memo; - } - ret = UBQHASH_IO_MEMO_MATCH; - goto set_file; - } - } - - // file does not exist, will need to be created - f = ubqhash_fopen(tmpfile, "wb+"); - if (!f) { - UBQHASH_CRITICAL("Could not create DAG file: \"%s\"", tmpfile); - goto free_memo; - } - // make sure it's of the proper size - if (fseek(f, (long int)(file_size + UBQHASH_DAG_MAGIC_NUM_SIZE - 1), SEEK_SET) != 0) { - fclose(f); - UBQHASH_CRITICAL("Could not seek to the end of DAG file: \"%s\". Insufficient space?", tmpfile); - goto free_memo; - } - if (fputc('\n', f) == EOF) { - fclose(f); - UBQHASH_CRITICAL("Could not write in the end of DAG file: \"%s\". Insufficient space?", tmpfile); - goto free_memo; - } - if (fflush(f) != 0) { - fclose(f); - UBQHASH_CRITICAL("Could not flush at end of DAG file: \"%s\". Insufficient space?", tmpfile); - goto free_memo; - } - ret = UBQHASH_IO_MEMO_MISMATCH; - goto set_file; - - ret = UBQHASH_IO_MEMO_MATCH; -set_file: - *output_file = f; -free_memo: - free(tmpfile); -end: - return ret; -} diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/io.h b/vendor/github.com/ubiq/ubqhash/src/libubqhash/io.h deleted file mode 100644 index e91a8245de..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/io.h +++ /dev/null @@ -1,202 +0,0 @@ -/* - This file is part of ubqhash. - - ubqhash 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. - - ubqhash 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 ubqhash. If not, see . -*/ -/** @file io.h - * @author Lefteris Karapetsas - * @date 2015 - */ -#pragma once -#include -#include -#include -#include -#ifdef __cplusplus -#define __STDC_FORMAT_MACROS 1 -#endif -#include -#include "endian.h" -#include "ubqhash.h" - -#ifdef __cplusplus -extern "C" { -#endif -// Maximum size for mutable part of DAG file name -// 6 is for "full-R", the suffix of the filename -// 10 is for maximum number of digits of a uint32_t (for REVISION) -// 1 is for - and 16 is for the first 16 hex digits for first 8 bytes of -// the seedhash and last 1 is for the null terminating character -// Reference: https://github.com/ethereum/wiki/wiki/Ubqhash-DAG -#define DAG_MUTABLE_NAME_MAX_SIZE (6 + 10 + 1 + 16 + 1) -/// Possible return values of @see ubqhash_io_prepare -enum ubqhash_io_rc { - UBQHASH_IO_FAIL = 0, ///< There has been an IO failure - UBQHASH_IO_MEMO_SIZE_MISMATCH, ///< DAG with revision/hash match, but file size was wrong. - UBQHASH_IO_MEMO_MISMATCH, ///< The DAG file did not exist or there was revision/hash mismatch - UBQHASH_IO_MEMO_MATCH, ///< DAG file existed and revision/hash matched. No need to do anything -}; - -// small hack for windows. I don't feel I should use va_args and forward just -// to have this one function properly cross-platform abstracted -#if defined(_WIN32) && !defined(__GNUC__) -#define snprintf(...) sprintf_s(__VA_ARGS__) -#endif - -/** - * Logs a critical error in important parts of ubqhash. Should mostly help - * figure out what kind of problem (I/O, memory e.t.c.) causes a NULL - * ubqhash_full_t - */ -#ifdef UBQHASH_PRINT_CRITICAL_OUTPUT -#define UBQHASH_CRITICAL(...) \ - do \ - { \ - printf("UBQHASH CRITICAL ERROR: "__VA_ARGS__); \ - printf("\n"); \ - fflush(stdout); \ - } while (0) -#else -#define UBQHASH_CRITICAL(...) -#endif - -/** - * Prepares io for ubqhash - * - * Create the DAG directory and the DAG file if they don't exist. - * - * @param[in] dirname A null terminated c-string of the path of the ubqhash - * data directory. If it does not exist it's created. - * @param[in] seedhash The seedhash of the current block number, used in the - * naming of the file as can be seen from the spec at: - * https://github.com/ethereum/wiki/wiki/Ubqhash-DAG - * @param[out] output_file If there was no failure then this will point to an open - * file descriptor. User is responsible for closing it. - * In the case of memo match then the file is open on read - * mode, while on the case of mismatch a new file is created - * on write mode - * @param[in] file_size The size that the DAG file should have on disk - * @param[out] force_create If true then there is no check to see if the file - * already exists - * @return For possible return values @see enum ubqhash_io_rc - */ -enum ubqhash_io_rc ubqhash_io_prepare( - char const* dirname, - ubqhash_h256_t const seedhash, - FILE** output_file, - uint64_t file_size, - bool force_create -); - -/** - * An fopen wrapper for no-warnings crossplatform fopen. - * - * Msvc compiler considers fopen to be insecure and suggests to use their - * alternative. This is a wrapper for this alternative. Another way is to - * #define _CRT_SECURE_NO_WARNINGS, but disabling all security warnings does - * not sound like a good idea. - * - * @param file_name The path to the file to open - * @param mode Opening mode. Check fopen() - * @return The FILE* or NULL in failure - */ -FILE* ubqhash_fopen(char const* file_name, char const* mode); - -/** - * An strncat wrapper for no-warnings crossplatform strncat. - * - * Msvc compiler considers strncat to be insecure and suggests to use their - * alternative. This is a wrapper for this alternative. Another way is to - * #define _CRT_SECURE_NO_WARNINGS, but disabling all security warnings does - * not sound like a good idea. - * - * @param des Destination buffer - * @param dest_size Maximum size of the destination buffer. This is the - * extra argument for the MSVC secure strncat - * @param src Souce buffer - * @param count Number of bytes to copy from source - * @return If all is well returns the dest buffer. If there is an - * error returns NULL - */ -char* ubqhash_strncat(char* dest, size_t dest_size, char const* src, size_t count); - -/** - * A cross-platform mkdir wrapper to create a directory or assert it's there - * - * @param dirname The full path of the directory to create - * @return true if the directory was created or if it already - * existed - */ -bool ubqhash_mkdir(char const* dirname); - -/** - * Get a file's size - * - * @param[in] f The open file stream whose size to get - * @param[out] size Pass a size_t by reference to contain the file size - * @return true in success and false if there was a failure - */ -bool ubqhash_file_size(FILE* f, size_t* ret_size); - -/** - * Get a file descriptor number from a FILE stream - * - * @param f The file stream whose fd to get - * @return Platform specific fd handler - */ -int ubqhash_fileno(FILE* f); - -/** - * Create the filename for the DAG. - * - * @param dirname The directory name in which the DAG file should reside - * If it does not end with a directory separator it is appended. - * @param filename The actual name of the file - * @param filename_length The length of the filename in bytes - * @return A char* containing the full name. User must deallocate. - */ -char* ubqhash_io_create_filename( - char const* dirname, - char const* filename, - size_t filename_length -); - -/** - * Gets the default directory name for the DAG depending on the system - * - * The spec defining this directory is here: https://github.com/ethereum/wiki/wiki/Ubqhash-DAG - * - * @param[out] strbuf A string buffer of sufficient size to keep the - * null termninated string of the directory name - * @param[in] buffsize Size of @a strbuf in bytes - * @return true for success and false otherwise - */ -bool ubqhash_get_default_dirname(char* strbuf, size_t buffsize); - -static inline bool ubqhash_io_mutable_name( - uint32_t revision, - ubqhash_h256_t const* seed_hash, - char* output -) -{ - uint64_t hash = *((uint64_t*)seed_hash); -#if LITTLE_ENDIAN == BYTE_ORDER - hash = ubqhash_swap_u64(hash); -#endif - return snprintf(output, DAG_MUTABLE_NAME_MAX_SIZE, "full-R%u-%016" PRIx64, revision, hash) >= 0; -} - -#ifdef __cplusplus -} -#endif diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/io_posix.c b/vendor/github.com/ubiq/ubqhash/src/libubqhash/io_posix.c deleted file mode 100644 index 9326c9ef76..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/io_posix.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - This file is part of ubqhash. - - ubqhash 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. - - ubqhash 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 ubqhash. If not, see . -*/ -/** @file io_posix.c - * @author Lefteris Karapetsas - * @date 2015 - */ - -#include "io.h" -#include -#include -#include -#include -#include -#include -#include -#include - -FILE* ubqhash_fopen(char const* file_name, char const* mode) -{ - return fopen(file_name, mode); -} - -char* ubqhash_strncat(char* dest, size_t dest_size, char const* src, size_t count) -{ - return strlen(dest) + count + 1 <= dest_size ? strncat(dest, src, count) : NULL; -} - -bool ubqhash_mkdir(char const* dirname) -{ - int rc = mkdir(dirname, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); - return rc != -1 || errno == EEXIST; -} - -int ubqhash_fileno(FILE *f) -{ - return fileno(f); -} - -char* ubqhash_io_create_filename( - char const* dirname, - char const* filename, - size_t filename_length -) -{ - size_t dirlen = strlen(dirname); - size_t dest_size = dirlen + filename_length + 1; - if (dirname[dirlen] != '/') { - dest_size += 1; - } - char* name = malloc(dest_size); - if (!name) { - return NULL; - } - - name[0] = '\0'; - ubqhash_strncat(name, dest_size, dirname, dirlen); - if (dirname[dirlen] != '/') { - ubqhash_strncat(name, dest_size, "/", 1); - } - ubqhash_strncat(name, dest_size, filename, filename_length); - return name; -} - -bool ubqhash_file_size(FILE* f, size_t* ret_size) -{ - struct stat st; - int fd; - if ((fd = fileno(f)) == -1 || fstat(fd, &st) != 0) { - return false; - } - *ret_size = st.st_size; - return true; -} - -bool ubqhash_get_default_dirname(char* strbuf, size_t buffsize) -{ - static const char dir_suffix[] = ".ubqhash/"; - strbuf[0] = '\0'; - char* home_dir = getenv("HOME"); - if (!home_dir || strlen(home_dir) == 0) - { - struct passwd* pwd = getpwuid(getuid()); - if (pwd) - home_dir = pwd->pw_dir; - } - - size_t len = strlen(home_dir); - if (!ubqhash_strncat(strbuf, buffsize, home_dir, len)) { - return false; - } - if (home_dir[len] != '/') { - if (!ubqhash_strncat(strbuf, buffsize, "/", 1)) { - return false; - } - } - return ubqhash_strncat(strbuf, buffsize, dir_suffix, sizeof(dir_suffix)); -} diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/io_win32.c b/vendor/github.com/ubiq/ubqhash/src/libubqhash/io_win32.c deleted file mode 100644 index 688d72566c..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/io_win32.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - This file is part of ubqhash. - - ubqhash 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. - - ubqhash 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 ubqhash. If not, see . -*/ -/** @file io_win32.c - * @author Lefteris Karapetsas - * @date 2015 - */ - -#include "io.h" -#include -#include -#include -#include -#include -#include - -FILE* ubqhash_fopen(char const* file_name, char const* mode) -{ - FILE* f; - return fopen_s(&f, file_name, mode) == 0 ? f : NULL; -} - -char* ubqhash_strncat(char* dest, size_t dest_size, char const* src, size_t count) -{ - return strncat_s(dest, dest_size, src, count) == 0 ? dest : NULL; -} - -bool ubqhash_mkdir(char const* dirname) -{ - int rc = _mkdir(dirname); - return rc != -1 || errno == EEXIST; -} - -int ubqhash_fileno(FILE* f) -{ - return _fileno(f); -} - -char* ubqhash_io_create_filename( - char const* dirname, - char const* filename, - size_t filename_length -) -{ - size_t dirlen = strlen(dirname); - size_t dest_size = dirlen + filename_length + 1; - if (dirname[dirlen] != '\\' || dirname[dirlen] != '/') { - dest_size += 1; - } - char* name = malloc(dest_size); - if (!name) { - return NULL; - } - - name[0] = '\0'; - ubqhash_strncat(name, dest_size, dirname, dirlen); - if (dirname[dirlen] != '\\' || dirname[dirlen] != '/') { - ubqhash_strncat(name, dest_size, "\\", 1); - } - ubqhash_strncat(name, dest_size, filename, filename_length); - return name; -} - -bool ubqhash_file_size(FILE* f, size_t* ret_size) -{ - struct _stat st; - int fd; - if ((fd = _fileno(f)) == -1 || _fstat(fd, &st) != 0) { - return false; - } - *ret_size = st.st_size; - return true; -} - -bool ubqhash_get_default_dirname(char* strbuf, size_t buffsize) -{ - static const char dir_suffix[] = "Ubqhash\\"; - strbuf[0] = '\0'; - if (!SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, (CHAR*)strbuf))) { - return false; - } - if (!ubqhash_strncat(strbuf, buffsize, "\\", 1)) { - return false; - } - - return ubqhash_strncat(strbuf, buffsize, dir_suffix, sizeof(dir_suffix)); -} diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/mmap.h b/vendor/github.com/ubiq/ubqhash/src/libubqhash/mmap.h deleted file mode 100644 index de0e7c257e..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/mmap.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - This file is part of ubqhash. - - ubqhash 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. - - ubqhash 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 ubqhash. If not, see . -*/ -/** @file mmap.h - * @author Lefteris Karapetsas - * @date 2015 - */ -#pragma once -#if defined(__MINGW32__) || defined(_WIN32) -#include - -#define PROT_READ 0x1 -#define PROT_WRITE 0x2 -/* This flag is only available in WinXP+ */ -#ifdef FILE_MAP_EXECUTE -#define PROT_EXEC 0x4 -#else -#define PROT_EXEC 0x0 -#define FILE_MAP_EXECUTE 0 -#endif - -#define MAP_SHARED 0x01 -#define MAP_PRIVATE 0x02 -#define MAP_ANONYMOUS 0x20 -#define MAP_ANON MAP_ANONYMOUS -#define MAP_FAILED ((void *) -1) - -void* mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset); -void munmap(void* addr, size_t length); -#else // posix, yay! ^_^ -#include -#endif - - diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/mmap_win32.c b/vendor/github.com/ubiq/ubqhash/src/libubqhash/mmap_win32.c deleted file mode 100644 index 42968b98a4..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/mmap_win32.c +++ /dev/null @@ -1,84 +0,0 @@ -/* mmap() replacement for Windows - * - * Author: Mike Frysinger - * Placed into the public domain - */ - -/* References: - * CreateFileMapping: http://msdn.microsoft.com/en-us/library/aa366537(VS.85).aspx - * CloseHandle: http://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx - * MapViewOfFile: http://msdn.microsoft.com/en-us/library/aa366761(VS.85).aspx - * UnmapViewOfFile: http://msdn.microsoft.com/en-us/library/aa366882(VS.85).aspx - */ - -#include -#include -#include "mmap.h" - -#ifdef __USE_FILE_OFFSET64 -# define DWORD_HI(x) (x >> 32) -# define DWORD_LO(x) ((x) & 0xffffffff) -#else -# define DWORD_HI(x) (0) -# define DWORD_LO(x) (x) -#endif - -void* mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset) -{ - if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC)) - return MAP_FAILED; - if (fd == -1) { - if (!(flags & MAP_ANON) || offset) - return MAP_FAILED; - } else if (flags & MAP_ANON) - return MAP_FAILED; - - DWORD flProtect; - if (prot & PROT_WRITE) { - if (prot & PROT_EXEC) - flProtect = PAGE_EXECUTE_READWRITE; - else - flProtect = PAGE_READWRITE; - } else if (prot & PROT_EXEC) { - if (prot & PROT_READ) - flProtect = PAGE_EXECUTE_READ; - else if (prot & PROT_EXEC) - flProtect = PAGE_EXECUTE; - } else - flProtect = PAGE_READONLY; - - off_t end = length + offset; - HANDLE mmap_fd, h; - if (fd == -1) - mmap_fd = INVALID_HANDLE_VALUE; - else - mmap_fd = (HANDLE)_get_osfhandle(fd); - h = CreateFileMapping(mmap_fd, NULL, flProtect, DWORD_HI(end), DWORD_LO(end), NULL); - if (h == NULL) - return MAP_FAILED; - - DWORD dwDesiredAccess; - if (prot & PROT_WRITE) - dwDesiredAccess = FILE_MAP_WRITE; - else - dwDesiredAccess = FILE_MAP_READ; - if (prot & PROT_EXEC) - dwDesiredAccess |= FILE_MAP_EXECUTE; - if (flags & MAP_PRIVATE) - dwDesiredAccess |= FILE_MAP_COPY; - void *ret = MapViewOfFile(h, dwDesiredAccess, DWORD_HI(offset), DWORD_LO(offset), length); - if (ret == NULL) { - ret = MAP_FAILED; - } - // since we are handling the file ourselves with fd, close the Windows Handle here - CloseHandle(h); - return ret; -} - -void munmap(void* addr, size_t length) -{ - UnmapViewOfFile(addr); -} - -#undef DWORD_HI -#undef DWORD_LO diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/sha3.c b/vendor/github.com/ubiq/ubqhash/src/libubqhash/sha3.c deleted file mode 100644 index e72fe10184..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/sha3.c +++ /dev/null @@ -1,151 +0,0 @@ -/** libkeccak-tiny -* -* A single-file implementation of SHA-3 and SHAKE. -* -* Implementor: David Leon Gil -* License: CC0, attribution kindly requested. Blame taken too, -* but not liability. -*/ -#include "sha3.h" - -#include -#include -#include -#include - -/******** The Keccak-f[1600] permutation ********/ - -/*** Constants. ***/ -static const uint8_t rho[24] = \ - { 1, 3, 6, 10, 15, 21, - 28, 36, 45, 55, 2, 14, - 27, 41, 56, 8, 25, 43, - 62, 18, 39, 61, 20, 44}; -static const uint8_t pi[24] = \ - {10, 7, 11, 17, 18, 3, - 5, 16, 8, 21, 24, 4, - 15, 23, 19, 13, 12, 2, - 20, 14, 22, 9, 6, 1}; -static const uint64_t RC[24] = \ - {1ULL, 0x8082ULL, 0x800000000000808aULL, 0x8000000080008000ULL, - 0x808bULL, 0x80000001ULL, 0x8000000080008081ULL, 0x8000000000008009ULL, - 0x8aULL, 0x88ULL, 0x80008009ULL, 0x8000000aULL, - 0x8000808bULL, 0x800000000000008bULL, 0x8000000000008089ULL, 0x8000000000008003ULL, - 0x8000000000008002ULL, 0x8000000000000080ULL, 0x800aULL, 0x800000008000000aULL, - 0x8000000080008081ULL, 0x8000000000008080ULL, 0x80000001ULL, 0x8000000080008008ULL}; - -/*** Helper macros to unroll the permutation. ***/ -#define rol(x, s) (((x) << s) | ((x) >> (64 - s))) -#define REPEAT6(e) e e e e e e -#define REPEAT24(e) REPEAT6(e e e e) -#define REPEAT5(e) e e e e e -#define FOR5(v, s, e) \ - v = 0; \ - REPEAT5(e; v += s;) - -/*** Keccak-f[1600] ***/ -static inline void keccakf(void* state) { - uint64_t* a = (uint64_t*)state; - uint64_t b[5] = {0}; - uint64_t t = 0; - uint8_t x, y; - - for (int i = 0; i < 24; i++) { - // Theta - FOR5(x, 1, - b[x] = 0; - FOR5(y, 5, - b[x] ^= a[x + y]; )) - FOR5(x, 1, - FOR5(y, 5, - a[y + x] ^= b[(x + 4) % 5] ^ rol(b[(x + 1) % 5], 1); )) - // Rho and pi - t = a[1]; - x = 0; - REPEAT24(b[0] = a[pi[x]]; - a[pi[x]] = rol(t, rho[x]); - t = b[0]; - x++; ) - // Chi - FOR5(y, - 5, - FOR5(x, 1, - b[x] = a[y + x];) - FOR5(x, 1, - a[y + x] = b[x] ^ ((~b[(x + 1) % 5]) & b[(x + 2) % 5]); )) - // Iota - a[0] ^= RC[i]; - } -} - -/******** The FIPS202-defined functions. ********/ - -/*** Some helper macros. ***/ - -#define _(S) do { S } while (0) -#define FOR(i, ST, L, S) \ - _(for (size_t i = 0; i < L; i += ST) { S; }) -#define mkapply_ds(NAME, S) \ - static inline void NAME(uint8_t* dst, \ - const uint8_t* src, \ - size_t len) { \ - FOR(i, 1, len, S); \ - } -#define mkapply_sd(NAME, S) \ - static inline void NAME(const uint8_t* src, \ - uint8_t* dst, \ - size_t len) { \ - FOR(i, 1, len, S); \ - } - -mkapply_ds(xorin, dst[i] ^= src[i]) // xorin -mkapply_sd(setout, dst[i] = src[i]) // setout - -#define P keccakf -#define Plen 200 - -// Fold P*F over the full blocks of an input. -#define foldP(I, L, F) \ - while (L >= rate) { \ - F(a, I, rate); \ - P(a); \ - I += rate; \ - L -= rate; \ - } - -/** The sponge-based hash construction. **/ -static inline int hash(uint8_t* out, size_t outlen, - const uint8_t* in, size_t inlen, - size_t rate, uint8_t delim) { - if ((out == NULL) || ((in == NULL) && inlen != 0) || (rate >= Plen)) { - return -1; - } - uint8_t a[Plen] = {0}; - // Absorb input. - foldP(in, inlen, xorin); - // Xor in the DS and pad frame. - a[inlen] ^= delim; - a[rate - 1] ^= 0x80; - // Xor in the last block. - xorin(a, in, inlen); - // Apply P - P(a); - // Squeeze output. - foldP(out, outlen, setout); - setout(a, out, outlen); - memset(a, 0, 200); - return 0; -} - -#define defsha3(bits) \ - int sha3_##bits(uint8_t* out, size_t outlen, \ - const uint8_t* in, size_t inlen) { \ - if (outlen > (bits/8)) { \ - return -1; \ - } \ - return hash(out, outlen, in, inlen, 200 - (bits / 4), 0x01); \ - } - -/*** FIPS202 SHA3 FOFs ***/ -defsha3(256) -defsha3(512) diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/sha3.h b/vendor/github.com/ubiq/ubqhash/src/libubqhash/sha3.h deleted file mode 100644 index 096c673b2b..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/sha3.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "compiler.h" -#include -#include - -struct ubqhash_h256; - -#define decsha3(bits) \ - int sha3_##bits(uint8_t*, size_t, uint8_t const*, size_t); - -decsha3(256) -decsha3(512) - -static inline void SHA3_256(struct ubqhash_h256 const* ret, uint8_t const* data, size_t const size) -{ - sha3_256((uint8_t*)ret, 32, data, size); -} - -static inline void SHA3_512(uint8_t* ret, uint8_t const* data, size_t const size) -{ - sha3_512(ret, 64, data, size); -} - -#ifdef __cplusplus -} -#endif diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/sha3_cryptopp.cpp b/vendor/github.com/ubiq/ubqhash/src/libubqhash/sha3_cryptopp.cpp deleted file mode 100644 index a1b430f512..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/sha3_cryptopp.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/* - This file is part of ubqhash. - - ubqhash 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. - - ubqhash 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 ubqhash. If not, see . -*/ - -/** @file sha3.cpp -* @author Tim Hughes -* @date 2015 -*/ -#include -#include - -extern "C" { -struct ubqhash_h256; -typedef struct ubqhash_h256 ubqhash_h256_t; -void SHA3_256(ubqhash_h256_t const* ret, uint8_t const* data, size_t size) -{ - CryptoPP::SHA3_256().CalculateDigest((uint8_t*)ret, data, size); -} - -void SHA3_512(uint8_t* const ret, uint8_t const* data, size_t size) -{ - CryptoPP::SHA3_512().CalculateDigest(ret, data, size); -} -} diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/sha3_cryptopp.h b/vendor/github.com/ubiq/ubqhash/src/libubqhash/sha3_cryptopp.h deleted file mode 100644 index d1e2365a4a..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/sha3_cryptopp.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#include "compiler.h" -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct ubqhash_h256; - -void SHA3_256(struct ubqhash_h256 const* ret, uint8_t const* data, size_t size); -void SHA3_512(uint8_t* const ret, uint8_t const* data, size_t size); - -#ifdef __cplusplus -} -#endif diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/ubqhash.h b/vendor/github.com/ubiq/ubqhash/src/libubqhash/ubqhash.h deleted file mode 100644 index eea0b12168..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/ubqhash.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - This file is part of ubqhash. - - ubqhash 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. - - ubqhash 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 ubqhash. If not, see . -*/ - -/** @file ubqhash.h -* @date 2015 -*/ -#pragma once - -#include -#include -#include -#include -#include "compiler.h" - -#define UBQHASH_REVISION 23 -#define UBQHASH_DATASET_BYTES_INIT 1073741824U // 2**30 -#define UBQHASH_DATASET_BYTES_GROWTH 8388608U // 2**23 -#define UBQHASH_CACHE_BYTES_INIT 1073741824U // 2**24 -#define UBQHASH_CACHE_BYTES_GROWTH 131072U // 2**17 -#define UBQHASH_EPOCH_LENGTH 30000U -#define UBQHASH_MIX_BYTES 128 -#define UBQHASH_HASH_BYTES 64 -#define UBQHASH_DATASET_PARENTS 256 -#define UBQHASH_CACHE_ROUNDS 3 -#define UBQHASH_ACCESSES 64 -#define UBQHASH_DAG_MAGIC_NUM_SIZE 8 -#define UBQHASH_DAG_MAGIC_NUM 0xFEE1DEADBADDCAFE -#define UBQHASH_UIP1_EPOCH 22 - -#ifdef __cplusplus -extern "C" { -#endif - -/// Type of a seedhash/blockhash e.t.c. -typedef struct ubqhash_h256 { uint8_t b[32]; } ubqhash_h256_t; - -// convenience macro to statically initialize an h256_t -// usage: -// ubqhash_h256_t a = ubqhash_h256_static_init(1, 2, 3, ... ) -// have to provide all 32 values. If you don't provide all the rest -// will simply be unitialized (not guranteed to be 0) -#define ubqhash_h256_static_init(...) \ - { {__VA_ARGS__} } - -struct ubqhash_light; -typedef struct ubqhash_light* ubqhash_light_t; -struct ubqhash_full; -typedef struct ubqhash_full* ubqhash_full_t; -typedef int(*ubqhash_callback_t)(unsigned); - -typedef struct ubqhash_return_value { - ubqhash_h256_t result; - ubqhash_h256_t mix_hash; - bool success; -} ubqhash_return_value_t; - -/** - * Allocate and initialize a new ubqhash_light handler - * - * @param block_number The block number for which to create the handler - * @return Newly allocated ubqhash_light handler or NULL in case of - * ERRNOMEM or invalid parameters used for @ref ubqhash_compute_cache_nodes() - */ -ubqhash_light_t ubqhash_light_new(uint64_t block_number); -/** - * Frees a previously allocated ubqhash_light handler - * @param light The light handler to free - */ -void ubqhash_light_delete(ubqhash_light_t light); -/** - * Calculate the light client data - * - * @param light The light client handler - * @param header_hash The header hash to pack into the mix - * @param nonce The nonce to pack into the mix - * @return an object of ubqhash_return_value_t holding the return values - */ -ubqhash_return_value_t ubqhash_light_compute( - ubqhash_light_t light, - ubqhash_h256_t const header_hash, - uint64_t nonce -); - -/** - * Allocate and initialize a new ubqhash_full handler - * - * @param light The light handler containing the cache. - * @param callback A callback function with signature of @ref ubqhash_callback_t - * It accepts an unsigned with which a progress of DAG calculation - * can be displayed. If all goes well the callback should return 0. - * If a non-zero value is returned then DAG generation will stop. - * Be advised. A progress value of 100 means that DAG creation is - * almost complete and that this function will soon return succesfully. - * It does not mean that the function has already had a succesfull return. - * @return Newly allocated ubqhash_full handler or NULL in case of - * ERRNOMEM or invalid parameters used for @ref ubqhash_compute_full_data() - */ -ubqhash_full_t ubqhash_full_new(ubqhash_light_t light, ubqhash_callback_t callback); - -/** - * Frees a previously allocated ubqhash_full handler - * @param full The light handler to free - */ -void ubqhash_full_delete(ubqhash_full_t full); -/** - * Calculate the full client data - * - * @param full The full client handler - * @param header_hash The header hash to pack into the mix - * @param nonce The nonce to pack into the mix - * @return An object of ubqhash_return_value to hold the return value - */ -ubqhash_return_value_t ubqhash_full_compute( - ubqhash_full_t full, - ubqhash_h256_t const header_hash, - uint64_t nonce -); -/** - * Get a pointer to the full DAG data - */ -void const* ubqhash_full_dag(ubqhash_full_t full); -/** - * Get the size of the DAG data - */ -uint64_t ubqhash_full_dag_size(ubqhash_full_t full); - -/** - * Calculate the seedhash for a given block number - */ -ubqhash_h256_t ubqhash_get_seedhash(uint64_t block_number); - -#ifdef __cplusplus -} -#endif diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/util.h b/vendor/github.com/ubiq/ubqhash/src/libubqhash/util.h deleted file mode 100644 index adddacb0fa..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/util.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - This file is part of ubqhash. - - ubqhash 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. - - ubqhash 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 ubqhash. If not, see . -*/ -/** @file util.h - * @author Tim Hughes - * @date 2015 - */ -#pragma once -#include -#include "compiler.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _MSC_VER -void debugf(char const* str, ...); -#else -#define debugf printf -#endif - -static inline uint32_t min_u32(uint32_t a, uint32_t b) -{ - return a < b ? a : b; -} - -static inline uint32_t clamp_u32(uint32_t x, uint32_t min_, uint32_t max_) -{ - return x < min_ ? min_ : (x > max_ ? max_ : x); -} - -#ifdef __cplusplus -} -#endif diff --git a/vendor/github.com/ubiq/ubqhash/src/libubqhash/util_win32.c b/vendor/github.com/ubiq/ubqhash/src/libubqhash/util_win32.c deleted file mode 100644 index 268e6db056..0000000000 --- a/vendor/github.com/ubiq/ubqhash/src/libubqhash/util_win32.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-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. - - cpp-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 cpp-ethereum. If not, see . -*/ -/** @file util.c - * @author Tim Hughes - * @date 2015 - */ -#include -#include -#include "util.h" - - -// foward declare without all of Windows.h -__declspec(dllimport) void __stdcall OutputDebugStringA(char const* lpOutputString); - -void debugf(char const* str, ...) -{ - va_list args; - va_start(args, str); - - char buf[1<<16]; - _vsnprintf_s(buf, sizeof(buf), sizeof(buf), str, args); - buf[sizeof(buf)-1] = '\0'; - OutputDebugStringA(buf); -} diff --git a/vendor/github.com/ubiq/ubqhash/ubqhash.go b/vendor/github.com/ubiq/ubqhash/ubqhash.go deleted file mode 100644 index a1ee5f4d25..0000000000 --- a/vendor/github.com/ubiq/ubqhash/ubqhash.go +++ /dev/null @@ -1,450 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// Copyright 2015 Lefteris Karapetsas -// Copyright 2015 Matthew Wampler-Doty -// 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 ubqhash - -/* -#include "src/libubqhash/internal.h" - -int ubqhashGoCallback_cgo(unsigned); -*/ -import "C" - -import ( - "errors" - "fmt" - "io/ioutil" - "math/big" - "math/rand" - "os" - "os/user" - "path/filepath" - "runtime" - "sync" - "sync/atomic" - "time" - "unsafe" - - "github.com/ubiq/go-ubiq/common" - "github.com/ubiq/go-ubiq/crypto" - "github.com/ubiq/go-ubiq/log" - "github.com/ubiq/go-ubiq/pow" -) - -var ( - maxUint256 = new(big.Int).Exp(big.NewInt(2), big.NewInt(256), big.NewInt(0)) - sharedLight = new(Light) -) - -const ( - epochLength uint64 = 30000 - cacheSizeForTesting C.uint64_t = 1024 - dagSizeForTesting C.uint64_t = 1024 * 32 - uip1Epoch uint64 = 22 -) - -var DefaultDir = defaultDir() - -func defaultDir() string { - home := os.Getenv("HOME") - if user, err := user.Current(); err == nil { - home = user.HomeDir - } - if runtime.GOOS == "windows" { - return filepath.Join(home, "AppData", "Ubqhash") - } - return filepath.Join(home, ".ubqhash") -} - -// cache wraps an ubqhash_light_t with some metadata -// and automatic memory management. -type cache struct { - epoch uint64 - used time.Time - test bool - - gen sync.Once // ensures cache is only generated once. - ptr *C.struct_ubqhash_light -} - -// generate creates the actual cache. it can be called from multiple -// goroutines. the first call will generate the cache, subsequent -// calls wait until it is generated. -func (cache *cache) generate() { - cache.gen.Do(func() { - started := time.Now() - seedHash := makeSeedHash(cache.epoch) - glog.V(logger.Debug).Infof("Generating cache for epoch %d (%x)", cache.epoch, seedHash) - size := C.ubqhash_get_cachesize(C.uint64_t(cache.epoch * epochLength)) - if cache.test { - size = cacheSizeForTesting - } - if cache.epoch >= uip1Epoch { - cache.ptr = C.ubqhash_light_new_internal(size, (*C.ubqhash_h256_t)(unsafe.Pointer(&seedHash[0])), true) - } else { - cache.ptr = C.ubqhash_light_new_internal(size, (*C.ubqhash_h256_t)(unsafe.Pointer(&seedHash[0])), false) - } - runtime.SetFinalizer(cache, freeCache) - glog.V(logger.Debug).Infof("Done generating cache for epoch %d, it took %v", cache.epoch, time.Since(started)) - }) -} - -func freeCache(cache *cache) { - C.ubqhash_light_delete(cache.ptr) - cache.ptr = nil -} - -func (cache *cache) compute(dagSize uint64, hash common.Hash, nonce uint64) (ok bool, mixDigest, result common.Hash) { - ret := C.ubqhash_light_compute_internal(cache.ptr, C.uint64_t(dagSize), hashToH256(hash), C.uint64_t(nonce)) - // Make sure cache is live until after the C call. - // This is important because a GC might happen and execute - // the finalizer before the call completes. - _ = cache - return bool(ret.success), h256ToHash(ret.mix_hash), h256ToHash(ret.result) -} - -// Light implements the Verify half of the proof of work. It uses a few small -// in-memory caches to verify the nonces found by Full. -type Light struct { - test bool // If set, use a smaller cache size - - mu sync.Mutex // Protects the per-epoch map of verification caches - caches map[uint64]*cache // Currently maintained verification caches - future *cache // Pre-generated cache for the estimated future DAG - - NumCaches int // Maximum number of caches to keep before eviction (only init, don't modify) -} - -// Verify checks whether the block's nonce is valid. -func (l *Light) Verify(block pow.Block) bool { - // TODO: do ubqhash_quick_verify before getCache in order - // to prevent DOS attacks. - blockNum := block.NumberU64() - if blockNum >= epochLength*2048 { - glog.V(logger.Debug).Infof("block number %d too high, limit is %d", blockNum, epochLength*2048) - return false - } - - difficulty := block.Difficulty() - /* Cannot happen if block header diff is validated prior to PoW, but can - happen if PoW is checked first due to parallel PoW checking. - We could check the minimum valid difficulty but for SoC we avoid (duplicating) - Ubiq protocol consensus rules here which are not in scope of Ubqhash - */ - if difficulty.Cmp(common.Big0) == 0 { - glog.V(logger.Debug).Infof("invalid block difficulty") - return false - } - - cache := l.getCache(blockNum) - dagSize := C.ubqhash_get_datasize(C.uint64_t(blockNum)) - if l.test { - dagSize = dagSizeForTesting - } - // Recompute the hash using the cache. - ok, mixDigest, result := cache.compute(uint64(dagSize), block.HashNoNonce(), block.Nonce()) - if !ok { - return false - } - - // avoid mixdigest malleability as it's not included in a block's "hashNononce" - if block.MixDigest() != mixDigest { - return false - } - - // The actual check. - target := new(big.Int).Div(maxUint256, difficulty) - return result.Big().Cmp(target) <= 0 -} - -func h256ToHash(in C.ubqhash_h256_t) common.Hash { - return *(*common.Hash)(unsafe.Pointer(&in.b)) -} - -func hashToH256(in common.Hash) C.ubqhash_h256_t { - return C.ubqhash_h256_t{b: *(*[32]C.uint8_t)(unsafe.Pointer(&in[0]))} -} - -func (l *Light) getCache(blockNum uint64) *cache { - var c *cache - epoch := blockNum / epochLength - - // If we have a PoW for that epoch, use that - l.mu.Lock() - if l.caches == nil { - l.caches = make(map[uint64]*cache) - } - if l.NumCaches == 0 { - l.NumCaches = 3 - } - c = l.caches[epoch] - if c == nil { - // No cached DAG, evict the oldest if the cache limit was reached - if len(l.caches) >= l.NumCaches { - var evict *cache - for _, cache := range l.caches { - if evict == nil || evict.used.After(cache.used) { - evict = cache - } - } - glog.V(logger.Debug).Infof("Evicting DAG for epoch %d in favour of epoch %d", evict.epoch, epoch) - delete(l.caches, evict.epoch) - } - // If we have the new DAG pre-generated, use that, otherwise create a new one - if l.future != nil && l.future.epoch == epoch { - glog.V(logger.Debug).Infof("Using pre-generated DAG for epoch %d", epoch) - c, l.future = l.future, nil - } else { - glog.V(logger.Debug).Infof("No pre-generated DAG available, creating new for epoch %d", epoch) - c = &cache{epoch: epoch, test: l.test} - } - l.caches[epoch] = c - - // If we just used up the future cache, or need a refresh, regenerate - if l.future == nil || l.future.epoch <= epoch { - glog.V(logger.Debug).Infof("Pre-generating DAG for epoch %d", epoch+1) - l.future = &cache{epoch: epoch + 1, test: l.test} - go l.future.generate() - } - } - c.used = time.Now() - l.mu.Unlock() - - // Wait for generation finish and return the cache - c.generate() - return c -} - -// dag wraps an ubqhash_full_t with some metadata -// and automatic memory management. -type dag struct { - epoch uint64 - test bool - dir string - - gen sync.Once // ensures DAG is only generated once. - ptr *C.struct_ubqhash_full -} - -// generate creates the actual DAG. it can be called from multiple -// goroutines. the first call will generate the DAG, subsequent -// calls wait until it is generated. -func (d *dag) generate() { - d.gen.Do(func() { - var ( - started = time.Now() - seedHash = makeSeedHash(d.epoch) - blockNum = C.uint64_t(d.epoch * epochLength) - cacheSize = C.ubqhash_get_cachesize(blockNum) - dagSize = C.ubqhash_get_datasize(blockNum) - ) - if d.test { - cacheSize = cacheSizeForTesting - dagSize = dagSizeForTesting - } - if d.dir == "" { - d.dir = DefaultDir - } - glog.V(logger.Info).Infof("Generating DAG for epoch %d (size %d) (%x)", d.epoch, dagSize, seedHash) - // Generate a temporary cache. - // TODO: this could share the cache with Light - var cache C.ubqhash_light_t - if blockNum >= C.uint64_t(uip1Epoch*epochLength) { - cache = C.ubqhash_light_new_internal(cacheSize, (*C.ubqhash_h256_t)(unsafe.Pointer(&seedHash[0])), true) - } else { - cache = C.ubqhash_light_new_internal(cacheSize, (*C.ubqhash_h256_t)(unsafe.Pointer(&seedHash[0])), false) - } - defer C.ubqhash_light_delete(cache) - // Generate the actual DAG. - d.ptr = C.ubqhash_full_new_internal( - C.CString(d.dir), - hashToH256(seedHash), - dagSize, - cache, - (C.ubqhash_callback_t)(unsafe.Pointer(C.ubqhashGoCallback_cgo)), - ) - if d.ptr == nil { - panic("ubqhash_full_new IO or memory error") - } - runtime.SetFinalizer(d, freeDAG) - glog.V(logger.Info).Infof("Done generating DAG for epoch %d, it took %v", d.epoch, time.Since(started)) - }) -} - -func freeDAG(d *dag) { - C.ubqhash_full_delete(d.ptr) - d.ptr = nil -} - -func (d *dag) Ptr() unsafe.Pointer { - return unsafe.Pointer(d.ptr.data) -} - -//export ubqhashGoCallback -func ubqhashGoCallback(percent C.unsigned) C.int { - glog.V(logger.Info).Infof("Generating DAG: %d%%", percent) - return 0 -} - -// MakeDAG pre-generates a DAG file for the given block number in the -// given directory. If dir is the empty string, the default directory -// is used. -func MakeDAG(blockNum uint64, dir string) error { - d := &dag{epoch: blockNum / epochLength, dir: dir} - if blockNum >= epochLength*2048 { - return fmt.Errorf("block number too high, limit is %d", epochLength*2048) - } - d.generate() - if d.ptr == nil { - return errors.New("failed") - } - return nil -} - -// Full implements the Search half of the proof of work. -type Full struct { - Dir string // use this to specify a non-default DAG directory - - test bool // if set use a smaller DAG size - turbo bool - hashRate int32 - - mu sync.Mutex // protects dag - current *dag // current full DAG -} - -func (pow *Full) getDAG(blockNum uint64) (d *dag) { - epoch := blockNum / epochLength - pow.mu.Lock() - if pow.current != nil && pow.current.epoch == epoch { - d = pow.current - } else { - d = &dag{epoch: epoch, test: pow.test, dir: pow.Dir} - pow.current = d - } - pow.mu.Unlock() - // wait for it to finish generating. - d.generate() - return d -} - -func (pow *Full) Search(block pow.Block, stop <-chan struct{}, index int) (nonce uint64, mixDigest []byte) { - dag := pow.getDAG(block.NumberU64()) - - r := rand.New(rand.NewSource(time.Now().UnixNano())) - diff := block.Difficulty() - - i := int64(0) - starti := i - start := time.Now().UnixNano() - previousHashrate := int32(0) - - nonce = uint64(r.Int63()) - hash := hashToH256(block.HashNoNonce()) - target := new(big.Int).Div(maxUint256, diff) - for { - select { - case <-stop: - atomic.AddInt32(&pow.hashRate, -previousHashrate) - return 0, nil - default: - i++ - - // we don't have to update hash rate on every nonce, so update after - // first nonce check and then after 2^X nonces - if i == 2 || ((i % (1 << 16)) == 0) { - elapsed := time.Now().UnixNano() - start - hashes := (float64(1e9) / float64(elapsed)) * float64(i-starti) - hashrateDiff := int32(hashes) - previousHashrate - previousHashrate = int32(hashes) - atomic.AddInt32(&pow.hashRate, hashrateDiff) - } - - ret := C.ubqhash_full_compute(dag.ptr, hash, C.uint64_t(nonce)) - result := h256ToHash(ret.result).Big() - - // TODO: disagrees with the spec https://github.com/ethereum/wiki/wiki/Ubqhash#mining - if ret.success && result.Cmp(target) <= 0 { - mixDigest = C.GoBytes(unsafe.Pointer(&ret.mix_hash), C.int(32)) - atomic.AddInt32(&pow.hashRate, -previousHashrate) - return nonce, mixDigest - } - nonce += 1 - } - - if !pow.turbo { - time.Sleep(20 * time.Microsecond) - } - } -} - -func (pow *Full) GetHashrate() int64 { - return int64(atomic.LoadInt32(&pow.hashRate)) -} - -func (pow *Full) Turbo(on bool) { - // TODO: this needs to use an atomic operation. - pow.turbo = on -} - -// Ubqhash combines block verification with Light and -// nonce searching with Full into a single proof of work. -type Ubqhash struct { - *Light - *Full -} - -// New creates an instance of the proof of work. -func New() *Ubqhash { - return &Ubqhash{new(Light), &Full{turbo: true}} -} - -// NewShared creates an instance of the proof of work., where a single instance -// of the Light cache is shared across all instances created with NewShared. -func NewShared() *Ubqhash { - return &Ubqhash{sharedLight, &Full{turbo: true}} -} - -// NewForTesting creates a proof of work for use in unit tests. -// It uses a smaller DAG and cache size to keep test times low. -// DAG files are stored in a temporary directory. -// -// Nonces found by a testing instance are not verifiable with a -// regular-size cache. -func NewForTesting() (*Ubqhash, error) { - dir, err := ioutil.TempDir("", "ubqhash-test") - if err != nil { - return nil, err - } - return &Ubqhash{&Light{test: true}, &Full{Dir: dir, test: true}}, nil -} - -func GetSeedHash(blockNum uint64) ([]byte, error) { - if blockNum >= epochLength*2048 { - return nil, fmt.Errorf("block number too high, limit is %d", epochLength*2048) - } - sh := makeSeedHash(blockNum / epochLength) - return sh[:], nil -} - -func makeSeedHash(epoch uint64) (sh common.Hash) { - for ; epoch > 0; epoch-- { - sh = crypto.Sha3Hash(sh[:]) - } - return sh -} diff --git a/vendor/github.com/ubiq/ubqhash/ubqhashc.go b/vendor/github.com/ubiq/ubqhash/ubqhashc.go deleted file mode 100644 index c9899d16b5..0000000000 --- a/vendor/github.com/ubiq/ubqhash/ubqhashc.go +++ /dev/null @@ -1,52 +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 ubqhash - -/* - -mno-stack-arg-probe disables stack probing which avoids the function - __chkstk_ms being linked. this avoids a clash of this symbol as we also - separately link the secp256k1 lib which ends up defining this symbol - - 1. https://gcc.gnu.org/onlinedocs/gccint/Stack-Checking.html - 2. https://groups.google.com/forum/#!msg/golang-dev/v1bziURSQ4k/88fXuJ24e-gJ - 3. https://groups.google.com/forum/#!topic/golang-nuts/VNP6Mwz_B6o - -*/ - -/* -#cgo CFLAGS: -std=gnu99 -Wall -#cgo windows CFLAGS: -mno-stack-arg-probe -#cgo LDFLAGS: -lm - -#include "src/libubqhash/internal.c" -#include "src/libubqhash/sha3.c" -#include "src/libubqhash/blake2b-ref.c" -#include "src/libubqhash/io.c" - -#ifdef _WIN32 -# include "src/libubqhash/io_win32.c" -# include "src/libubqhash/mmap_win32.c" -#else -# include "src/libubqhash/io_posix.c" -#endif - -// 'gateway function' for calling back into go. -extern int ubqhashGoCallback(unsigned); -int ubqhashGoCallback_cgo(unsigned percent) { return ubqhashGoCallback(percent); } - -*/ -import "C" 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) -// Gubiqostuuid(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) +// Gethostuuid(uuid *byte, timeout *Timespec) (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 8b0e3b01b3..5e68d76dbe 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/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 876adba808..b379ac708e 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", @@ -171,10 +183,16 @@ "revisionTime": "2016-06-03T03:41:37Z" }, { - "checksumSHA1": "sGdhjz2N/DpfiZrMnHSzl2H/YX8=", + "checksumSHA1": "gKyBj05YkfuLFruAyPZ4KV9nFp8=", + "path": "github.com/julienschmidt/httprouter", + "revision": "975b5c4c7c21c0e3d2764200bf2aa8e34657ae6e", + "revisionTime": "2017-04-30T22:20:11Z" + }, + { + "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 }, { @@ -238,10 +256,22 @@ "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": "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", + "revision": "3101606756c53221ed58ba94ecba6b26adf89dcc", + "revisionTime": "2017-08-14T17:01:13Z" }, { "checksumSHA1": "KAzbLjI9MzW2tjfcAsK75lVRp6I=", @@ -316,166 +346,178 @@ "revisionTime": "2016-06-18T19:32:21Z" }, { - "checksumSHA1": "QvOrAO5S37PL/6XZVWIVGyAbn60=", + "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", - "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=", "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=", @@ -514,10 +556,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=", @@ -658,10 +706,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/ubiq/go-ubiq" diff --git a/whisper/mailserver/mailserver.go b/whisper/mailserver/mailserver.go index 6f2f0b986d..e2a9a14a8d 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 a369c9412b..2af057ae5e 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/shhclient/client.go b/whisper/shhclient/client.go index 1c949ee8a6..aeef4ecbdd 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 } diff --git a/whisper/whisperv2/api.go b/whisper/whisperv2/api.go index 383f6417bb..b072098a14 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 42928ea1a6..4157703df0 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/api.go b/whisper/whisperv5/api.go index 8a741bd015..1e84e2a33a 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") @@ -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(), } @@ -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 } 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 2c38e5d7c1..d63740c744 100644 --- a/whisper/whisperv5/filter.go +++ b/whisper/whisperv5/filter.go @@ -22,6 +22,7 @@ import ( "sync" "github.com/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/crypto" "github.com/ubiq/go-ubiq/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 c771eee180..e8badd3b95 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/gen_criteria_json.go b/whisper/whisperv5/gen_criteria_json.go index 2915c843da..dcd91b3091 100644 --- a/whisper/whisperv5/gen_criteria_json.go +++ b/whisper/whisperv5/gen_criteria_json.go @@ -8,6 +8,8 @@ import ( "github.com/ubiq/go-ubiq/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 ac628269d9..32aaf75214 100644 --- a/whisper/whisperv5/gen_message_json.go +++ b/whisper/whisperv5/gen_message_json.go @@ -8,6 +8,8 @@ import ( "github.com/ubiq/go-ubiq/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 40deb6c488..9a981380bf 100644 --- a/whisper/whisperv5/gen_newmessage_json.go +++ b/whisper/whisperv5/gen_newmessage_json.go @@ -8,6 +8,8 @@ import ( "github.com/ubiq/go-ubiq/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 5861e52ce0..60dbc5b496 100644 --- a/whisper/whisperv5/message_test.go +++ b/whisper/whisperv5/message_test.go @@ -25,11 +25,6 @@ import ( "github.com/ubiq/go-ubiq/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/topic.go b/whisper/whisperv5/topic.go index c6d4f59106..9cc979b22a 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 85a22ed6a1..1bce65a7f7 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/whisperv5/whisper_test.go b/whisper/whisperv5/whisper_test.go index 1451438336..dcb86cfb86 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/ubiq/go-ubiq/common" ) func TestWhisperBasic(t *testing.T) { @@ -424,7 +426,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 +543,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 +612,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 { @@ -618,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") + } +} diff --git a/whisper/whisperv6/api.go b/whisper/whisperv6/api.go new file mode 100644 index 0000000000..11581d40d6 --- /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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/common/hexutil" + "github.com/ubiq/go-ubiq/crypto" + "github.com/ubiq/go-ubiq/log" + "github.com/ubiq/go-ubiq/p2p/discover" + "github.com/ubiq/go-ubiq/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..3eaeba78ef --- /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/ubiq/go-ubiq/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/vendor/github.com/ubiq/ubqhash/compat.go b/whisper/whisperv6/config.go similarity index 76% rename from vendor/github.com/ubiq/ubqhash/compat.go rename to whisper/whisperv6/config.go index 2676c44e29..d7f817aa2d 100644 --- a/vendor/github.com/ubiq/ubqhash/compat.go +++ b/whisper/whisperv6/config.go @@ -14,18 +14,14 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package ubqhash +package whisperv6 -import ( - "math/big" - - "github.com/ubiq/go-ubiq/common" -) - -type Block interface { - Difficulty() *big.Int - HashNoNonce() common.Hash - Nonce() uint64 - MixDigest() common.Hash - NumberU64() uint64 +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..bf34ab056f --- /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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/common/math" + "github.com/ubiq/go-ubiq/crypto" + "github.com/ubiq/go-ubiq/crypto/ecies" + "github.com/ubiq/go-ubiq/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..7ef3eddd87 --- /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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/crypto" + "github.com/ubiq/go-ubiq/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..3cba3d77ef --- /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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/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..15cdc5b20a --- /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/ubiq/go-ubiq/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..4b63c75902 --- /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/ubiq/go-ubiq/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..11147eabb9 --- /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/ubiq/go-ubiq/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..3a1dea986d --- /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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/crypto" + "github.com/ubiq/go-ubiq/crypto/ecies" + "github.com/ubiq/go-ubiq/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..385b4dbc4f --- /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/ubiq/go-ubiq/crypto" + "github.com/ubiq/go-ubiq/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..06491abcca --- /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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/log" + "github.com/ubiq/go-ubiq/p2p" + "github.com/ubiq/go-ubiq/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..e99b9ae847 --- /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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/crypto" + "github.com/ubiq/go-ubiq/p2p" + "github.com/ubiq/go-ubiq/p2p/discover" + "github.com/ubiq/go-ubiq/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 := 30388 + + 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. ":30388" + 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..2d731831e4 --- /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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/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 (t *TopicType) String() string { + return common.ToHex(t[:]) +} + +// 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..d803313a88 --- /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/ubiq/go-ubiq/common" + "github.com/ubiq/go-ubiq/crypto" + "github.com/ubiq/go-ubiq/log" + "github.com/ubiq/go-ubiq/p2p" + "github.com/ubiq/go-ubiq/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, 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..717773faab --- /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/ubiq/go-ubiq/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") + } +}